instrucciones SSE no temporal (MOVNTI, MOVNTQ, etc.), no siguen las reglas normales de caché de coherencia. 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 produce y no (inmediatamente) consume más, el hecho de que las operaciones de almacenamiento de memoria caché de leer una línea completa primero y luego modificar 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.
Por esta y otras situaciones similares, los procesadores proporcionan apoyo a las 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/
Tenga en cuenta que SSE4.1 'MOVNTDQA XMMI, m128' es una carga NT, mientras que todas las demás instrucciones NT son las tiendas, a excepción de' prefetchnta'. La respuesta aceptada aquí solo parece estar hablando de tiendas. [Esto es lo que he podido mostrar sobre las cargas NT] (http://stackoverflow.com/questions/32103968/non-temporal-loads-and-the-hardware-prefetcher-do-they-work-together) TL: DR: es de esperar que la CPU haga algo útil con la sugerencia de NT para minimizar la contaminación de la memoria caché, pero no anulan la semántica fuertemente ordenada de la memoria WB "normal", por lo que tienen que usar la memoria caché. –
Actualización: NT * cargas * puede no hacer nada útil, excepto en las regiones de memoria UCSW en la mayoría de las CPU (por ejemplo, la familia Intel SnB). NT/streaming * stores * definitivamente funcionan en la memoria normal, sin embargo. –
@Peter: ¿Te refieres a la memoria de USWC, verdad?Nunca había oído hablar de UCSW o memoria USWC antes. Buscar en Google el acrónimo incorrecto no fue útil :-) –