2011-02-25 4 views
8

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?

Respuesta

15

La lectura de valores de SSE no alineados es extraordinariamente cara. Consulte los manuales de Intel, volumen 4, capítulo 2.2.5.1. El tipo de núcleo hace una diferencia, i7 tiene hardware adicional para que sea menos costoso. Pero leer un valor que se extiende por el límite de la línea de caché de la CPU sigue siendo 4.5 veces más lento que la lectura de un valor alineado. Es diez veces más lento en las arquitecturas anteriores.

Eso es masivo, alinea la memoria para evitar ese golpe de perforación. Nunca escuché acerca de _mm_malloc, use _aligned_malloc() desde Microsoft CRT para obtener la memoria alineada correctamente del montón.

+6

Buena respuesta. Esperaba encontrar respuestas de "perfil de tu código" aquí ... – Inverse

+0

Ya no es tan caro en las arquitecturas modernas. – Quonux

1

eche un vistazo a bullet physics. se ha utilizado para un puñado de películas y juegos conocidos (GTA4 y otros). Puede echar un vistazo a su vector súper optimizado, matriz y otras clases de matemática, o simplemente usarlas en su lugar. está publicado bajo la licencia zlib así que puedes usarlo como lo desees. No reinventar la rueda. Bullet, nvidia physx, havok y otras bibliotecas de física están bien probadas y optimizadas por muchachos inteligentes

Cuestiones relacionadas