web-dev-qa-db-fra.com

Que sont les indices de localité _mm_prefetch ()?

Le guide intrinsèque en dit long sur void _mm_prefetch (char const* p, int i):

Récupérez la ligne de données de la mémoire qui contient l'adresse p à un emplacement dans la hiérarchie de cache spécifiée par l'indice de localité i.

Pourriez-vous répertorier les valeurs possibles pour int i paramètre et expliquer leur signification?

J'ai trouvé _MM_HINT_T0, _MM_HINT_T1, _MM_HINT_T2, _MM_HINT_NTA et _MM_HINT_ENTA, mais je ne sais pas s'il s'agit d'une liste exhaustive et ce qu'ils signifient.

Si spécifique au processeur, je voudrais savoir ce qu'ils font sur Ryzen et les derniers processeurs Intel Core.

15
Serge Rogatch

Parfois, les intrinsèques sont mieux comprises en termes d'instruction qu'ils représentent plutôt qu'en tant que sémantique abstraite donnée dans leurs descriptions.


L'ensemble complet des constantes de localité, comme aujourd'hui, est

#define _MM_HINT_T0 1
#define _MM_HINT_T1 2
#define _MM_HINT_T2 3
#define _MM_HINT_NTA 0
#define _MM_HINT_ENTA 4
#define _MM_HINT_ET0 5
#define _MM_HINT_ET1 6
#define _MM_HINT_ET2 7

comme décrit dans cet article sur les capacités de prélecture du coprocesseur Intel Xeon Phi .

Pour les processeurs IA32/AMD, l'ensemble est réduit à

#define _MM_HINT_T0 1
#define _MM_HINT_T1 2
#define _MM_HINT_T2 3
#define _MM_HINT_NTA 0
#define _MM_HINT_ET1 6

_mm_prefetch est compilé en différentes instructions basées sur l'architecture et l'indice de localité

    Hint              IA32/AMD          iMC
_MM_HINT_T0           prefetcht0     vprefetch0
_MM_HINT_T1           prefetcht1     vprefetch1
_MM_HINT_T2           prefetcht2     vprefetch2
_MM_HINT_NTA          prefetchtnta   vprefetchnta
_MM_HINT_ENTA              -         vprefetchenta
_MM_HINT_ET0               -         vprefetchet0
_MM_HINT_ET1          prefetchtwt1   vprefetchet1
_MM_HINT_ET2               -         vprefetchet2

Qu'est-ce que le (v)prefetch les instructions, si toutes les conditions sont remplies, consistent à introduire une valeur de ligne de cache de données dans le niveau de cache spécifié par l'indice de localité.
L'instruction n'est qu'un indice, elle peut être ignorée.

Lorsqu'une ligne est extraite au niveau X, les manuels (à la fois Intel et AMD) indiquent qu'elle est également extraite à tous les autres niveaux supérieurs (mais pour le cas X = 3).
Je ne suis pas sûr que ce soit vrai, je crois que la ligne est pré-lue par respect niveau de cache X et selon les stratégies de mise en cache des niveaux supérieurs (inclusif ou non inclusif), il peut y être présent ou non.

Un autre attribut du (v)prefetch instructions est l'attribut non temporel.
Il est peu probable qu'une donnée non temporelle soit réutilisée prochainement.
À ma connaissance, les données NT sont stockées dans les "tampons de chargement en continu" pour l'architecture IA321 tandis que pour l'architecture iMC, il est stocké dans le cache normal (en utilisant comme chemin l'ID du thread matériel) mais avec la politique de remplacement d'utilisation la plus récente (de sorte que ce sera la prochaine ligne expulsée si nécessaire).
Pour AMD, le manuel indique que l'emplacement réel dépend de l'implémentation, allant d'un tampon logiciel invisible à un cache non temporel dédié.

Le dernier attribut de (v)prefetch instructions est l'attribut "intention" ou l'attribut "expulsion".
En raison des protocoles MESI et variantes, une demande de propriété doit être faite pour mettre une ligne dans un état exclusif (afin de la modifier).
. nous savons que nous lui écrirons plus tard.

Les architectures IA32 et AMD ne prennent pas en charge et pour l'instant un indice non temporel exclusif, car la façon dont le niveau de cache non temporel est défini par l'implémentation.
L'architecture iMC le permet avec le code de localité _MM_HINT_ENTA.

1 Ce que je comprends être les tampons WC. Peter Cordes a clarifié cela sur un commentaire ci-dessous : prefetchnta utilise uniquement les tampons de remplissage de ligne si la lecture anticipée des régions de mémoire USWC. Sinon, il se prélecte dans L1


Pour référence, voici la description des instructions impliquées

PREFETCHh

Récupère la ligne de données de la mémoire qui contient l'octet spécifié avec l'opérande source vers un emplacement dans la hiérarchie de cache spécifiée par une indication de localité:

• T0 (données temporelles): récupérez les données à tous les niveaux de la hiérarchie du cache.
• T1 (données temporelles par rapport aux échecs de cache de premier niveau) - prélecture des données dans le cache de niveau 2 et plus.
• T2 (données temporelles par rapport aux échecs de cache de second niveau) - prélecture des données dans le cache de niveau 3 et supérieur, ou un choix spécifique à l'implémentation.
• NTA (données non temporelles par rapport à tous les niveaux de cache) - prélecture des données dans une structure de cache non temporelle et dans un emplacement proche du processeur, minimisant la pollution du cache.

PREFETCHWT1

Récupère la ligne de données de la mémoire qui contient l'octet spécifié avec l'opérande source vers un emplacement dans la hiérarchie de cache spécifié par l'intention d'écrire un indice (de sorte que les données soient amenées dans l'état `` exclusif '' via une demande de propriété) et une localité allusion:

• T1 (données temporelles par rapport au cache de premier niveau) - prélecture des données dans le cache de deuxième niveau.

VPREFETCHh

                Cache  Temporal    Exclusive state
                 Level
VPREFETCH0       L1     NO          NO
VPREFETCHNTA     L1     YES         NO
VPREFETCH1       L2     NO          NO
VPREFETCH2       L2     YES         NO
VPREFETCHE0      L1     NO          YES
VPREFETCHENTA    L1     YES         YES
VPREFETCHE1      L2     NO          YES
VPREFETCHE2      L2     YES         YES
17
Margaret Bloom