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

StackOverflow https://stackoverflow.com/questions/37070

  •  09-06-2019
  •  | 
  •  

Pregunta

Esta es una pregunta un tanto 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 Nuevo Testamento en MOVNTDQA significa No temporal, y que por lo demás es lo mismo que MOVDQA.

Mi pregunta es, ¿qué significa No temporal ¿significar?

¿Fue útil?

Solución

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 vean sus resultados de manera oportuna.

Cuando los datos se producen 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 saca de las cachés los datos que podrían volver a ser necesarios en favor de los datos que no se utilizarán pronto.Esto es especialmente cierto para estructuras de datos grandes, como matrices, que se rellenan y luego se utilizan.Antes de que se llene el último elemento de la matriz, el gran tamaño expulsa los primeros elementos, lo que hace que el almacenamiento en caché de las escrituras sea ineficaz.

Para esta y otras situaciones similares, los procesadores brindan soporte para operaciones de escritura no temporales.En este contexto, no temporal significa que los datos no se reutilizarán 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/

Otros consejos

Espo da en el blanco.Sólo quería añadir mi granito de arena:

La frase "no temporal" significa que carece de localidad temporal.Los cachés explotan dos tipos de localidad: espacial y temporal, y al utilizar una instrucción no temporal le estás indicando al procesador que no esperas que el elemento de datos se utilice en un futuro próximo.

Soy un poco escéptico sobre el ensamblaje codificado a mano que utiliza las instrucciones de control de caché.En mi experiencia, estas cosas conducen a más errores dañinos que cualquier aumento efectivo del rendimiento.

Según el Manual del desarrollador de software de arquitecturas Intel® 64 e IA-32, Volumen 1:Arquitectura básica, "Programación con Intel Streaming Simd Extensions (Intel SSE)" Capítulo:

Almacenamiento en caché de temporal vs.Datos no temporales

Los datos a los que hace referencia un programa pueden ser temporales (los datos se utilizarán nuevamente) o no temporales (los datos serán referenciados una vez y no se reutilizarán en el futuro inmediato).Por ejemplo, el código de un programa es generalmente temporal, mientras que los datos multimedia, como la lista de visualización en una aplicación de gráficos tridimensionales, suelen ser atemporales.Para hacer un uso eficiente de las cachés del procesador, generalmente es deseable almacenar en caché los datos temporales y no los datos no temporales.La sobrecarga de las cachés del procesador con datos no temporales a veces se denomina "contaminar las cachés".Las instrucciones de control de capacidad de caché SSE y SSE2 permiten que un programa escriba datos no temporales en la memoria de una manera que minimice la contaminación de las cachés.

Descripción de instrucciones de carga y almacenamiento no temporales.Fuente:Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, volumen 2:Referencia del conjunto de instrucciones

LOAD (MOVNTDQA—Cargar sugerencia alineada no temporal de doble palabra cuádruple)

Carga una palabra cuádruple doble desde el operando de origen (segundo operando) al operando de destino (primer operando) utilizando una sugerencia no temporal si la fuente de memoria es del tipo de memoria WC (combinación de escritura) [...]

[...] el procesador no lee los datos en la jerarquía de caché, ni recupera la línea de caché correspondiente de la memoria a la jerarquía de caché.

Tenga en cuenta que, como comenta Peter Cordes, no es útil en la memoria WB (reescritura) normal en los procesadores actuales porque se ignora la sugerencia de NT (probablemente porque no hay captadores previos de HW compatibles con NT) y se aplica la semántica de carga fuertemente ordenada completa. . prefetchnta Se puede utilizar como carga reductora de la contaminación desde la memoria WB.

ALMACENAR (MOVNTDQ: almacenar enteros empaquetados mediante sugerencias no temporales)

Mueve los enteros empaquetados en el operando de origen (segundo operando) al operando de destino (primer operando) utilizando una sugerencia no temporal para evitar el almacenamiento en caché de los datos durante la escritura en la memoria.

[...] el procesador no escribe los datos en la jerarquía de caché, ni recupera la línea de caché correspondiente de la memoria a la jerarquía de caché.

Utilizando la terminología definida en Políticas de escritura en caché y rendimiento, se pueden considerar como de escritura (sin asignación de escritura, sin recuperación al escribir).

Finalmente, puede ser interesante revisar John McAlpin señala sobre tiendas no temporales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top