OpenCV Suma szybkości różnic kwadratów

Używałem openCV do dopasowywania bloków i zauważyłem, że jego suma kodu kwadratów różnic jest bardzo szybka w porównaniu z prostą pętlą typu:

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

Jeśli spojrzę na kod źródłowy, aby zobaczyć, gdzie dzieje się ciężkie podnoszenie, ludzie OpenCV mają swoje pętle for do 4 obliczeń różnicy kwadratów na raz w każdej iteracji pętli. Funkcja dopasowywania bloku wygląda następująco.

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

To obliczenie dotyczy niepodpisanych 8-bitowych liczb całkowitych. Wykonują podobne obliczenia dla 32-bitowych pływaków w tej funkcji:

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

Zastanawiałem się, czy ktoś miał jakiś pomysł, czy przerwanie pętli do 4 takich fragmentów może przyspieszyć kod? Powinienem dodać, że w tym kodzie nie ma wielowątkowości.

questionAnswers(2)

yourAnswerToTheQuestion