C'est une question quelque peu basique. Dans l'assemblage x86, il existe deux instructions SSE:
MOVDQA xmmi, m128
et
MOVNTDQA xmmi, m128
Le manuel du développeur de logiciels IA-32 indique que le NT dans MOVNTDQA signifie Non-Temporel , et que sinon c'est la même chose que MOVDQA.
Ma question est: que signifie non temporel ?
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.Réponses:
Les instructions SSE non temporelles (MOVNTI, MOVNTQ, etc.) ne suivent pas les règles normales de cohérence du cache. Par conséquent, les mémoires non temporelles doivent être suivies d'une instruction SFENCE pour que leurs résultats soient vus par d'autres processeurs en temps opportun.
Lorsque des données sont produites et ne sont pas (immédiatement) consommées à nouveau, le fait que les opérations de stockage en mémoire lisent d'abord une ligne de cache complète, puis modifient les données mises en cache, nuit aux performances. Cette opération pousse les données hors des caches qui pourraient être à nouveau nécessaires au profit de données qui ne seront pas utilisées bientôt. Cela est particulièrement vrai pour les grandes structures de données, telles que les matrices, qui sont remplies puis utilisées plus tard. Avant que le dernier élément de la matrice ne soit rempli, la taille pure expulse les premiers éléments, rendant la mise en cache des écritures inefficace.
Pour cette situation et des situations similaires, les processeurs prennent en charge les opérations d'écriture non temporelles. Non temporel dans ce contexte signifie que les données ne seront pas réutilisées bientôt, il n'y a donc aucune raison de les mettre en cache. Ces opérations d'écriture non temporelles ne lisent pas une ligne de cache, puis la modifient; au lieu de cela, le nouveau contenu est directement écrit dans la mémoire.
Source: http://lwn.net/Articles/255364/
la source
SFENCE
ne soit pas nécessaire. Au moins dans le même fil. Pourriez-vous aussi regarder?sfence
est nécessaire pour les magasins NT, alors que cela n'est jamais requis uniquement pour les magasins normaux. Les magasins NT ne sont pas classés par rapport aux autres magasins (NT ou non), comme le voient d'autres threads , sans fichiersfence
. Pour les lectures à partir du même thread qui a fait les magasins, cependant, vous n'en avez jamais besoinsfence
: un thread donné verra toujours ses propres magasins dans l'ordre du programme, qu'il s'agisse de magasins NT ou non.Espo est à peu près sur la cible. Je voulais juste ajouter mes deux cents:
L'expression «non temporelle» signifie l'absence de localité temporelle. Les caches exploitent deux types de localité - spatiale et temporelle, et en utilisant une instruction non temporelle, vous signalez au processeur que vous ne vous attendez pas à ce que l'élément de données soit utilisé dans un proche avenir.
Je suis un peu sceptique quant à l'assemblage codé à la main qui utilise les instructions de contrôle du cache. D'après mon expérience, ces choses conduisent à plus de bugs pervers que toute augmentation efficace des performances.
la source
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
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)
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 WBSTORE (MOVNTDQ — Stocker les entiers compressés à l'aide d'une indication non temporelle)
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 .
la source
MOVNTDQA
ne fait rien de spécial sur les régions de mémoire WC (uncacheable Write-Combining), par exemple la RAM vidéo. Ce n'est pas du tout utile sur la mémoire WB normale (réécriture) sur le matériel actuel, l'indication NT est ignorée et la sémantique de charge fortement ordonnée complète s'applique.prefetchnta
peut être utile, cependant, comme charge de réduction de la pollution de la mémoire WB. Les architectures x86 actuelles prennent-elles en charge les charges non temporelles (à partir de la mémoire «normale»)? .