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.

questionAnswers(2)

yourAnswerToTheQuestion