OpenCV Сумма квадратов разностей скорости

Я использовал openCV для выполнения некоторого сопоставления блоков, и я заметил, что код суммы квадратов разностей очень быстрый по сравнению с прямым циклом for, подобным этому:

<code>int SSD = 0;
for(int i =0; i < arraySize; i++)
    SSD += (array1[i] - array2[i] )*(array1[i] - array2[i]);
</code>

Если я посмотрю на исходный код, чтобы увидеть, где происходит тяжелый подъем, то Люди OpenCV имеют свои циклы for, которые выполняют 4 квадрата разницы за раз в каждой итерации цикла. Функция для сопоставления блоков выглядит следующим образом.

<code>int64
icvCmpBlocksL2_8u_C1( const uchar * vec1, const uchar * vec2, int len )
{
int i, s = 0;
int64 sum = 0;

for( i = 0; i <= len - 4; i += 4 ) 
{   
    int v = vec1[i] - vec2[i];
    int e = v * v;

    v = vec1[i + 1] - vec2[i + 1]; 
    e += v * v;
    v = vec1[i + 2] - vec2[i + 2];
    e += v * v;
    v = vec1[i + 3] - vec2[i + 3];
    e += v * v;
    sum += e;
}

for( ; i < len; i++ )
{
    int v = vec1[i] - vec2[i];

    s += v * v;
}

return sum + s;
}
</code>

Это вычисление для 8-разрядных целых чисел без знака. Они выполняют аналогичные вычисления для 32-разрядных операций с плавающей запятой в этой функции:

<code>double
icvCmpBlocksL2_32f_C1( const float *vec1, const float *vec2, int len )
{
double sum = 0;
int i;

for( i = 0; i <= len - 4; i += 4 )
{
    double v0 = vec1[i] - vec2[i];
    double v1 = vec1[i + 1] - vec2[i + 1];
    double v2 = vec1[i + 2] - vec2[i + 2];
    double v3 = vec1[i + 3] - vec2[i + 3];

    sum += v0 * v0 + v1 * v1 + v2 * v2 + v3 * v3;
}
for( ; i < len; i++ )
{
    double v = vec1[i] - vec2[i];

    sum += v * v;
}
return sum;
}
</code>

Мне было интересно, есть ли у кого-нибудь идеи, может ли разбиение цикла на 4 части ускорить код? Я должен добавить, что в этом коде не происходит многопоточность.

Ответы на вопрос(2)

Ваш ответ на вопрос