OpenCV Soma da velocidade das diferenças ao quadrado
Eu tenho usado o openCV para fazer algumas combinações de blocos e tenho notado que a soma do código de diferenças quadradas é muito rápida em comparação com um straight for loop como este:
<code>int SSD = 0; for(int i =0; i < arraySize; i++) SSD += (array1[i] - array2[i] )*(array1[i] - array2[i]); </code>
Se eu olhar para o código-fonte para ver onde o trabalho pesado acontece, o pessoal do OpenCV tem seus loops for que fazem cálculos de 4 quadrados de diferença de cada vez em cada iteração do loop. A função para fazer a correspondência de blocos se parece com isso.
<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>
Este cálculo é para inteiros de 8 bits sem sinal. Eles realizam um cálculo semelhante para floats de 32 bits nessa função:
<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>
Eu queria saber se alguém tinha alguma idéia se quebrar um loop em pedaços de 4 como isso pode acelerar o código? Devo acrescentar que não há multithreading ocorrendo neste código.