Selon le manuel du développeur de logiciels des architectures Intel® 64 et IA-32, volume 1: Architecture de base, chapitre «Programmation avec les extensions Intel Streaming SIMD (Intel SSE)»:
Mise en cache des données temporelles et non temporelles
Les données référencées par un programme peuvent être temporelles (les données seront réutilisées) ou non temporelles (les données seront référencées une fois et ne seront pas réutilisées dans le futur immédiat). Par exemple, le code de programme est généralement temporel, alors que les données multimédias, telles que la liste d'affichage dans une application graphique 3D, sont souvent non temporelles. Pour utiliser efficacement les caches du processeur, il est généralement souhaitable de mettre en cache les données temporelles et non de mettre en cache les données non temporelles. La surcharge des caches du processeur avec des données non temporelles est parfois appelée «polluer les caches». Les instructions de contrôle de la capacité de mise en cache SSE et SSE2 permettent à un programme d'écrire des données non temporelles dans la mémoire d'une manière qui minimise la pollution des caches.
Description du chargement non temporel et instructions de stockage. Source: Manuel du développeur de logiciels des architectures Intel 64 et IA-32, volume 2: Référence du jeu d'instructions
CHARGER (MOVNTDQA - Charger un indice aligné non temporel à quatre mots doubles)
Charge un quadruple mot de l'opérande source (deuxième opérande) vers l'opérande de destination (premier opérande) à l'aide d'un indice non temporel si la source de mémoire est de type mémoire WC (combinaison d'écriture) [...]
[...] le processeur ne lit pas les données dans la hiérarchie d'antémémoire, ni n'extrait la ligne d'antémémoire correspondante de la mémoire dans la hiérarchie d'antémémoire.
Notez que, comme le fait remarquer Peter Cordes, ce n'est pas utile sur la mémoire WB normale (réécriture) sur les processeurs actuels car l'indication NT est ignorée (probablement parce qu'il n'y a pas de prélecteurs HW compatibles NT) et la sémantique de charge complète fortement ordonnée s'applique . prefetchnta
peut être utilisé comme charge réduisant la pollution à partir de la mémoire WB
STORE (MOVNTDQ — Stocker les entiers compressés à l'aide d'une indication non temporelle)
Déplace les entiers compressés de l'opérande source (deuxième opérande) vers l'opérande de destination (premier opérande) à l'aide d'un indice non temporel pour empêcher la mise en cache des données pendant l'écriture en mémoire.
[...] le processeur n'écrit pas les données dans la hiérarchie d'antémémoire, ni n'extrait la ligne d'antémémoire correspondante de la mémoire dans la hiérarchie d'antémémoire.
En utilisant la terminologie définie dans les stratégies d'écriture du cache et les performances , ils peuvent être considérés comme une écriture contournée (pas d'allocation d'écriture, pas de récupération en cas d'écriture manquée).
Enfin, il peut être intéressant de revoir les notes de John McAlpin sur les magasins non temporels .
MOVNTDQA xmmi, m128
est une charge NT, tandis que toutes les autres instructions NT sont stockées, à l'exception deprefetchnta
. La réponse acceptée ici semble ne parler que des magasins. C'est ce que j'ai pu découvrir à propos des charges NT . TL: DR: avec un peu de chance, le CPU fait quelque chose d'utile avec le conseil NT pour minimiser la pollution du cache, mais ils ne remplacent pas la sémantique fortement ordonnée de la mémoire WB "normale", ils doivent donc utiliser le cache.