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