Question

C'est une question de bas niveau.Dans l'assembly 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 sinon c'est la même chose que MOVDQA.

Ma question est, qu'est-ce que Non temporel signifier?

Était-ce utile?

La solution

Les instructions SSE non temporelles (MOVNTI, MOVNTQ, etc.) ne suivent pas les règles normales de cohérence du cache.Par conséquent, les magasins non temporels doivent être suivis d'une instruction SFENCE afin que leurs résultats soient visibles par les autres processeurs en temps opportun.

Lorsque les 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 est préjudiciable 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 de sitôt.Cela est particulièrement vrai pour les grandes structures de données, comme les matrices, qui sont remplies puis utilisées ultérieurement.Avant que le dernier élément de la matrice ne soit rempli, la taille même expulse les premiers éléments, rendant la mise en cache des écritures inefficace.

Dans cette situation et dans 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 prochainement, 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 ne la modifient pas ;au lieu de cela, le nouveau contenu est directement écrit dans la mémoire.

Source: http://lwn.net/Articles/255364/

Autres conseils

Espo est à peu près juste.Je voulais juste ajouter mes deux cents :

L'expression « non temporel » signifie manquer de localité temporelle.Les caches exploitent deux types de localités : 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 avenir proche.

Je suis un peu sceptique quant à l'assembly codé manuellement qui utilise les instructions de contrôle du cache.D'après mon expérience, ces choses conduisent à plus de bugs malveillants que n'importe quelle augmentation efficace des performances.

Selon le manuel du développeur de logiciels des architectures Intel® 64 et IA-32, volume 1 :Architecture de base, "Programmation avec Intel Streaming SIMD Extensions (Intel SSE)" CHAPITRE:

Mise en cache de Temporel vs.Données 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 seule fois et ne seront pas réutilisées dans l'immédiat).Par exemple, le code d'un programme est généralement temporel, alors que les données multimédia, 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 les données non temporelles.La surcharge des caches du processeur avec des données non temporelles est parfois qualifiée de « polluer les caches ».Les instructions de contrôle 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 intemporel et instructions de stockage.Source:Manuel du développeur de logiciels pour les architectures Intel 64 et IA-32, volume 2 :Référence du jeu d'instructions

CHARGEMENT (MOVNTDQA – Charger un indice à double quadruple mot non aligné dans le temps)

Charge un double mot quadruple de l'opérande source (deuxième opérande) à l'opérande de destination (premier opérande) à l'aide d'une indication non temporelle si la source de mémoire est de type mémoire WC (combinaison d'écritures) [...]

[...] le processeur ne lit pas les données dans la hiérarchie du cache, et ne récupère pas non plus la ligne de cache correspondante de la mémoire dans la hiérarchie du cache.

Notez que, comme le commente Peter Cordes, cela n'est pas utile sur la mémoire WB (écriture différée) normale sur les processeurs actuels car l'indice NT est ignoré (probablement parce qu'il n'y a pas de prélecture matérielle compatible NT) et la sémantique de chargement complète fortement ordonnée s'applique. . prefetchnta peut être utilisé comme charge de réduction de la pollution à partir de la mémoire WB

STOCKER (MOVNTDQ : stocker des entiers compressés à l'aide d'un indice non temporel)

Déplace les entiers compressés dans l'opérande source (deuxième opérande) vers l'opérande de destination (premier opérande) à l'aide d'une indication non temporelle 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 du cache, ni ne récupère la ligne de cache correspondante de la mémoire dans la hiérarchie du cache.

En utilisant la terminologie définie dans Politiques et performances d'écriture du cache, ils peuvent être considérés comme des écritures indirectes (pas d'allocation d'écriture, pas de récupération lors d'écriture manquée).

Enfin, il peut être intéressant de revoir Notes de John McAlpin sur les magasins non temporels.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top