En mi proyecto he implementado la clase básica CVector. Esta clase contiene el puntero flotante * a la matriz de coma flotante en bruto. Esta matriz se asigna dinámicamente utilizando la función estándar malloc().Uso de SSE para acelerar el cálculo - almacenar, cargar y alinear
Ahora tengo que acelerar algunos cálculos usando tales vectores. Desafortunadamente, como la memoria no está asignada con _mm_malloc(), no está alineada.
Como entiendo que tengo dos opciones:
1) Código de reescritura que asigna memoria a usar _mm_malloc() y, por ejemplo, utilizar el código como el siguiente:
void sub(float* v1, float* v2, float* v3, int size)
{
__m128* p_v1 = (__m128*)v1;
__m128* p_v2 = (__m128*)v2;
__m128 res;
for(int i = 0; i < size/4; ++i)
{
res = _mm_sub_ps(*p_v1,*p_v2);
_mm_store_ps(v3,res);
++p_v1;
++p_v2;
v3 += 4;
}
}
2) La segunda opción es para usar la instrucción _mm_loadu_ps() para cargar __m128 de la memoria no alineada y luego usarla para el cálculo.
void sub(float* v1, float* v2, float* v3, int size)
{
__m128 p_v1;
__m128 p_v2;
__m128 res;
for(int i = 0; i < size/4; ++i)
{
p_v1 = _mm_loadu_ps(v1);
p_v2 = _mm_loadu_ps(v2);
res = _mm_sub_ps(p_v1,p_v2);
_mm_store_ps(v3,res);
v1 += 4;
v2 += 4;
v3 += 4;
}
}
Así que mi pregunta es ¿qué opción será mejor o más rápida?
Buena respuesta. Esperaba encontrar respuestas de "perfil de tu código" aquí ... – Inverse
Ya no es tan caro en las arquitecturas modernas. – Quonux