He estado usando el OPENCV hacer algo de coincidencia de bloques y me he dado cuenta de que es la suma de las diferencias al cuadrado código es muy rápido en comparación con una recta hacia adelante para el bucle de esta manera:OpenCV suma de diferencias al cuadrado acelerar
int SSD = 0;
for(int i =0; i < arraySize; i++)
SSD += (array1[i] - array2[i])*(array1[i] - array2[i]);
Si miro el código fuente para ver dónde ocurre el trabajo pesado, las personas OpenCV tienen sus bucles for para hacer cálculos de 4 diferencias cuadradas a la vez en cada iteración del ciclo. La función para hacer la coincidencia de bloque se ve así.
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;
}
Este cálculo es para enteros de 8 bits sin signo. Llevan a cabo un cálculo similar para la flota de 32 bits en esta función:
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;
}
Me preguntaba si alguien tenía alguna idea de si romper un bucle en trozos de 4 les gusta esto podría acelerar el código? Debo añadir que no hay multithreading en este código.
Soy una especie de nuevo a la optimización de mi código. ¿Por qué dividir el cálculo de la diferencia cuadrada en 2 líneas proporciona una ventaja de velocidad? – ncRubert
Además, ¿qué están haciendo l y c? – ncRubert
@ncRubert El punto no se trata de romper el cálculo de la diferencia cuadrada, se trata de no calcular 2 veces la diferencia 'array1 [i] - array2 [i]'. – Antonio