Cuál es el significado de los accesos de memoria “no temporales” en x86

Esta es una pregunta de bajo nivel. En el ensamblaje x86 hay dos instrucciones de 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 ?

Las instrucciones de SSE no temporales (MOVNTI, MOVNTQ, etc.) no siguen 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 los datos se producen y no se vuelven a consumir (inmediatamente), el hecho de que las operaciones del almacenamiento en memoria lean primero una línea de caché completa y luego modifiquen los datos en caché es perjudicial para el rendimiento. Esta operación saca los datos de las memorias caché que podrían necesitarse de nuevo a favor de datos que no se usarán pronto. Esto es especialmente cierto para estructuras de datos grandes, como matrices, que se llenan y luego se usan. Antes de que se llene el último elemento de la matriz, el tamaño puro expulsa los primeros elementos, haciendo que el almacenamiento en caché de las escrituras sea ineficaz.

Para esto 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 almacenarlos en caché. Estas operaciones de escritura no temporales no leen una línea de caché y luego la modifican; en cambio, el nuevo contenido se escribe directamente en la memoria.

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

Espo está más o menos en el blanco. Solo quería agregar mis dos centavos:

La frase “no temporal” significa que carece de localidad temporal. Los cachés explotan dos tipos de localidad: espacial y temporal, y al usar una instrucción no temporal le indica al procesador que no espera que el elemento de datos se use en el 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.