Ésta es una pregunta 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 NT en MOVNTDQA significa Non-Temporal , y que por lo demás es lo mismo que MOVDQA.
Mi pregunta es, ¿qué significa no temporal ?
MOVNTDQA xmmi, m128
es una carga NT, mientras que todas las demás instrucciones NT son tiendas, exceptoprefetchnta
. La respuesta aceptada aquí solo parece estar hablando de tiendas. Esto es lo que he podido encontrar sobre las cargas NT . TL: DR: es de esperar que la CPU haga algo útil con la sugerencia de NT para minimizar la contaminación del caché, pero no anulan la semántica fuertemente ordenada de la memoria WB "normal", por lo que tienen que usar el caché.Respuestas:
Las instrucciones 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 otros procesadores puedan ver sus resultados de manera oportuna.
Cuando se producen datos y no se consumen (inmediatamente) de nuevo, 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 las cachés que podrían ser necesarios nuevamente 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. Antes de que se llene el último elemento de la matriz, el tamaño total expulsa los primeros elementos, lo que hace que el almacenamiento en caché de las escrituras sea ineficaz.
Para esta y situaciones similares, los procesadores brindan soporte para operaciones de escritura no temporales. No temporal en este contexto significa que los datos no se reutilizarán pronto, por lo que no hay razón para almacenarlos en caché. Estas operaciones de escritura intemporales 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/
fuente
SFENCE
puede que no sea necesario. Al menos en el mismo hilo. ¿Podrías mirar también?sfence
se requiere para las tiendas NT, mientras que nunca es necesario solo para las tiendas normales. Las tiendas NT no están ordenadas con respecto a otras tiendas (NT o no), como ven otros hilos , sin unsfence
. Sin embargo, para las lecturas del mismo hilo que hizo las tiendas, nunca es necesariosfence
: un hilo dado siempre verá sus propias tiendas en el orden del programa, independientemente de si son tiendas NT o no.Espo está bastante acertado. Solo quería agregar mis dos centavos:
La frase "no temporal" significa carecer de localidad temporal. Los cachés explotan dos tipos de localidad: espacial y temporal, y al usar una instrucción no temporal le está indicando al procesador que no espera que el elemento de datos se use en un futuro próximo.
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 malignos que cualquier aumento efectivo del rendimiento.
fuente
De acuerdo con el Manual del desarrollador de software de arquitecturas Intel® 64 e IA-32, Volumen 1: Arquitectura básica, capítulo "Programación con Intel Streaming SIMD Extensions (Intel SSE)":
Almacenamiento en caché de datos temporales frente a no temporales
Descripción de las instrucciones de almacenamiento y carga intemporal. Fuente: Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, volumen 2: referencia del conjunto de instrucciones
LOAD (MOVNTDQA — Cargar pista alineada no temporal de cuatro palabras dobles)
Tenga en cuenta que, como comenta Peter Cordes, no es útil en la memoria WB (escritura diferida) normal en los procesadores actuales porque se ignora la sugerencia de NT (probablemente porque no hay precapturadores de HW compatibles con NT) y se aplica la semántica de carga completa fuertemente ordenada .
prefetchnta
se puede utilizar como carga reductora de contaminación desde la memoria WBALMACENAR (MOVNTDQ — Almacenar enteros empaquetados usando una pista no temporal)
Usar la terminología definida en Rendimiento y políticas de escritura en caché , se pueden considerar como de escritura indirecta (sin asignación de escritura, sin recuperación al escribir).
Finalmente, puede ser interesante revisar las notas de John McAlpin sobre las tiendas intemporales .
fuente
MOVNTDQA
solo hace algo especial en regiones de memoria WC (combinación de escritura no almacenable en caché), por ejemplo, RAM de video. No es útil en absoluto en la memoria WB (escritura diferida) normal en el HW actual, la sugerencia de NT se ignora y se aplica la semántica de carga completa fuertemente ordenada.prefetchnta
Sin embargo, puede ser útil como carga reductora de contaminación de la memoria WB. ¿Las arquitecturas x86 actuales admiten cargas no temporales (de la memoria "normal")? .