Cuál es el significado de accesos a memoria "no temporales" en x86


Esta es una pregunta algo de bajo nivel. En el ensamblaje x86 hay dos instrucciones SSE:

MOVDQA xmmi, m128

Y

MOVNTDQA xmmi, m128

El Manual del Desarrollador de Software IA-32 dice que el NT en MOVNTDQA significa No Temporal, y que de lo contrario es lo mismo que MOVDQA.

Mi pregunta es, ¿qué significa No Temporal?

Author: kristianp, 2008-09-01

2 answers

Instrucciones SSE no temporales (MOVNTI, MOVNTQ, etc.), no siga las reglas normales de coherencia de caché. Por lo tanto, los almacenes no temporales deben ir seguidos de una instrucción SFENCE para que sus resultados puedan ser vistos por otros procesadores de manera oportuna.

Cuando se producen datos y no se vuelven a consumir (inmediatamente), el hecho de que las operaciones de almacenamiento de memoria lean primero una línea de caché completa y luego modifiquen los datos almacenados en caché es perjudicial para el rendimiento. Esta operación empuja los datos fuera de la cachés que podrían ser necesarios de nuevo a favor de los datos que no se utilizarán pronto. Esto es especialmente cierto para grandes estructuras de datos, como matrices, que se rellenan y luego se utilizan más tarde. Antes de que el último elemento de la matriz se llene, el tamaño puro desaloja a los primeros elementos, haciendo que el almacenamiento en caché de las escrituras sea ineficaz.

Para esta y situaciones similares, los procesadores proporcionan soporte para operaciones de escritura no temporales. No temporal en este contexto significa que los datos no serán reutilizados pronto, por lo que no hay razón para esconderlo. Estas operaciones de escritura no temporales no leen una línea de caché y luego la modifican; en su lugar, el nuevo contenido se escribe directamente en la memoria.

Fuente: http://lwn.net/Articles/255364/

 114
Author: Espo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-31 20:50:00

Espo es más o menos justo en el blanco. Solo quería añadir mis dos centavos:

La frase "no temporal" significa falta de localidad temporal. Las cachés explotan dos tipos de localidad: espacial y temporal, y al usar una instrucción no temporal, le está señalando al procesador que no espera que el elemento de datos se use en un futuro cercano.

Soy un poco escéptico sobre el ensamblaje codificado a mano que usa las instrucciones de control de caché. En mi experiencia estas cosas conducen a más errores malvados que cualquier rendimiento efectivo aumenta.

 31
Author: Pramod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-01 16:03:35