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

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

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

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

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;
}

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

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;
}

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

6
задан ncRubert 14 April 2012 в 17:46
поделиться