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 части ускорить код? Я должен добавить, что в этом коде не происходит многопоточность.