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.
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