Comment puis-je désactiver le préchargement de matériel par programmation?

Je voudrais désactiver par programmation le préchargement matériel.

De l’ optimisation des performances applicatives sur la microarchitecture Intel® Core ™ à l’aide de pré-récupérateurs implémentés par matériel et sur le choix du matériel et des logiciels sur prélecture sur l’ architecture Intel® 32 bits , je dois mettre à jour le MSR pour désactiver le préchargement matériel.

Voici un extrait pertinent:

“Les parameters DPL Prefetch et L2 Streaming Prefetch peuvent également être modifiés par programmation en écrivant un utilitaire de pilote de périphérique permettant de modifier les bits du registre IA32_MISC_ENABLEMSR 0x1A0 . Il permet d’activer ou de désactiver les mécanismes de lecture anticipée.

Le tableau ci-dessous montre les bits dans le IA32_MISC_ENABLE MSR qui doivent être modifiés afin de contrôler le DPL et L2 Streaming Prefetch:

 Prefetcher Type MSR (0x1A0) Bit Value DPL (Hardware Prefetch) Bit 9 0 = Enable 1 = Disable L2 Streamer (Adjacent Cache Line Prefetch) Bit 19 0 = Enable 1 = Disable" 

J’ai essayé d’utiliser http://etallen.com/msr.html mais cela n’a pas fonctionné. J’ai aussi essayé d’utiliser wrmsr dans asm/msr.h mais ce segfaults. J’ai essayé de le faire dans un module kernel … et j’ai tué la machine.

BTW – J’utilise le kernel 2.6.18-92.el5 et MSR est lié au kernel:

 $ grep -i msr /boot/config-$(uname -r) CONFIG_X86_MSR=y ... 

De la référence Intel:
Cette instruction doit être exécutée au niveau de privilège 0 ou en mode d’adresse réelle; sinon, une exception de protection générale #GP (0) sera générée. La spécification d’une adresse MSR réservée ou non implémentée dans ECX entraînera également une exception de protection générale.


L’instruction CPUID doit être utilisée pour déterminer si les MSR sont pris en charge (EDX [5] = 1) avant d’utiliser cette instruction.

Ainsi, votre faute peut être liée à un processeur qui ne prend pas en charge les MSR ou qui utilise une adresse MSR incorrecte.

Il y a beaucoup d’exemples d’utilisation des MSR dans les sources du kernel:

Dans la source du kernel, pour un seul processeur, il illustre la désactivation de la lecture anticipée pour le Xeon dans arch / i386 / kernel / cpu / intel.c, dans la fonction:

statique vide __cpuinit Intel_errata_workarounds (struct cpuinfo_x86 * c)

Les arguments de la fonction rdmsr sont le nombre msr, un pointeur sur le mot bas 32 bits et un pointeur sur le mot haut 32 bits.
Les arguments de la fonction wrmsr sont le nombre de msr, la valeur de mot faible de 32 bits et la valeur de mot de 32 bits élevée.

les systèmes multi-core ou smp doivent passer la structure cpu en premier argument:
void rdmsr_on_cpu (non signé int cpu, u32 msr_no, u32 * l, u32 * h);
void wrmsr_on_cpu (non signé int cpu, u32 msr_no, u32 l, u32 h);

Vous pouvez activer ou désactiver les récupérateurs de matériel à l’aide de msr-tools http://www.kernel.org/pub/linux/utils/cpu/msr-tools/ .

Ce qui suit permet le préfetcher de matériel (en désactivant le bit 9):

 [root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2089 [root@... msr-tools-1.2]# ./rdmsr 0x1a0 60628e2089 

Ce qui suit désactive le préfetcher matériel (en activant le bit 9):

 [root@... msr-tools-1.2]# ./wrmsr -p 0 0x1a0 0x60628e2289 [root@... msr-tools-1.2]# ./rdmsr 0x1a0 60628e2289 

Par programme, vous pouvez le faire en tant que root en ouvrant /dev/cpu//msr et en utilisant pwrite pour écrire dans le “fichier” msr au décalage 0x1a0 .

J’ajoute une réponse ici, car les précédentes peuvent ne pas être applicables à tous les processeurs Intel.

Pour mon processeur Intel Xeon 5650 (famille 06_2CH), le manuel chapitre 35 spécifie que les bits 10 à 8 du registre IA32_MISC_ENABLE à l’adresse 0x1A0 sont réservés. Je suppose que cela signifie que je ne peux pas activer et désactiver le préfetcher via MSR.

Selon une réponse d’un employé d’Intel: “Intel n’a pas révélé comment désactiver les préchargeurs sur les processeurs de Nehalem. Vous devrez désactiver les pré-récupérateurs en utilisant les options du BIOS.”

En 2014, Intel a publié des informations sur le préfixe h / w avec désactivation avec 0x1a4 msr (1a4 msr) pour Nehalem, Westmere, Sandy Bridge, Ivy Bridge, Haswell, Broadwell (et probablement les nouveaux cœurs). Lien a été trouvé par bholanath ici :

https://software.intel.com/fr-fr/articles/disclosure-of-hw-prefetcher-control-on-some-intel-processors Divulgation du contrôle pré-parsingur H / W sur certains processeurs Intel – Vish Viswanathan (Intel) 24 septembre 2014

Cet article décrit le paramètre MSR qui peut être utilisé pour contrôler les divers préchargeurs h / w disponibles sur les processeurs Intel basés sur les microarchitectures suivantes: Nehalem, Westmere, Sandy Bridge, Ivy Bridge, Haswell et Broadwell.

Les processeurs mentionnés ci-dessus prennent en charge 4 types de pré-récupérateurs H / W pour pré-extraire des données. Il y a 2 préchargeurs associés au cache de données L1 (également connu sous le nom de préfetcher DCU DCU, pré-parsingur IP DCU ) et 2 pré-récupérateurs associés au cache L2 (préfetcher de matériel L2, préfetcher de ligne de cache adjacent L2) .

Il existe un registre spécifique au modèle (MSR) sur chaque cœur avec une adresse de 0x1A4 pouvant être utilisé pour contrôler ces 4 pré-récupérateurs. Les bits 0 à 3 dans ce registre peuvent être utilisés pour activer ou désactiver ces récupérateurs. Les autres bits de ce MSR sont réservés.

Ils sont locaux pour chaque cœur de processeur et peuvent être modifiés par root avec l’aide du pilote de kernel Linux msr . Ils sont utilisés par Intel pour mesurer la latence de la mémoire dans NUMA avec l’outil Intel MLC:

Par exemple, l’outil de vérification de la latence de la mémoire Intel ( http://www.intel.com/software/mlc ) modifie les pré-récupérateurs en écrivant dans MSR 0x1a4 pour mesurer les latences précises et les restaurer à leur état d’origine à la sortie.