2012-01-13 7 views
15

¿Cuál es la diferencia entre las dos líneas siguientes?_mm_load_ps vs. _mm_load_pd vs. etc

__m128 x = _mm_load_ps((float *) ptr); 
__m128 y = _mm_load_pd((double *)ptr); 

En otras palabras, ¿por qué hay tantas diferentes _mm_load_xyz instrucciones, en vez de un genérico __m128 _mm_load(const void *)?

+3

El tipo de retorno para '_mm_load_pd' es' __m128d', no '__m128' –

+0

@PaulR: Eso ... tiene todo el sentido del mundo. No me di cuenta de eso por completo. Gracias por mencionarlo. :) – Mehrdad

Respuesta

13

Existen diferentes factores intrínsecos porque corresponden a instrucciones diferentes.

Existen diferentes instrucciones de carga porque Intel desea mantener la libertad de diseñar un procesador en el que los vectores de doble precisión estén respaldados por un archivo de registro físico diferente que los vectores de precisión simple o vectores enteros, o utilizar unidades de ejecución diferentes. Cualquiera de estos puede agregar latencia adicional si no hubiera una manera de especificar que los datos se carguen en el archivo de registro apropiado o en la red de reenvío.

Una forma de pensar es que las diferentes instrucciones hacen lo mismo, pero además proporcionan una pista al procesador diciéndole cómo los datos que se están cargando serán utilizados por las instrucciones futuras. Esto puede ayudar al procesador a asegurarse de que los datos estén en el lugar correcto para ser utilizados de la manera más eficiente posible, o puede ser ignorado por el procesador.

Tenga en cuenta que esto no es solo una hipotética. Existen procesadores en los que el uso de una carga vectorial entera (MOVDQA) para cargar datos consumidos por una operación de punto flotante requiere más tiempo que el uso de una carga de punto flotante para obtener datos para una operación de coma flotante (y viceversa) . Consulte el Manual de optimización de Intel o las notas de Agner Fog para obtener más detalles sobre el tema. Use la carga que coincida con la forma en que usará los datos para evitar el riesgo de tales riesgos de desempeño en el futuro.

+0

Vaya, no importa, me equivoqué: los tipos de devolución son diferentes. Eso tiene un total sentido ahora. :) +1 Muchas gracias. – Mehrdad

+0

@Mehrdad Esto se relaciona con la misma cuestión de cambio de dominio que mencioné en su pregunta de SSE de ayer. – Mysticial

3

_mm_load_ps cargas 4 sola coma flotante de precisión valora

_mm_load_pd cargas 2 dobles de coma flotante de precisión valora

Estos hacen cosas diferentes, así que creo que sólo tiene sentido tener diferentes funciones. Además, en C, no hay sobrecarga.

+0

Mejor explicación que la mía :) –

+0

¿Entonces es solo una cuestión de semántica, no una cuestión relacionada con la CPU? – Mehrdad

+0

@Mehrdad, bueno, ya que estamos trabajando con intrínsecos aquí, estas funciones pueden ser diferentes en su implementación, sin permitir la generalización. –

Cuestiones relacionadas