Comment puis-je faire un CPU vidage du cache dans Windows x86?
Je suis intéressé par le forçage d'un PROCESSEUR de vidage du cache dans Windows (pour l'analyse comparative des raisons, je veux émuler départ avec pas de données dans le cache du PROCESSEUR), de préférence une base C de la mise en œuvre ou Win32 appel.
Est-il un moyen connu à ce faire avec un appel système ou même quelque chose d'aussi sournois que de faire dire un grand memcpy
?
Intel i686 plate-forme (P4 et est bien ainsi).
Vous devez vous connecter pour publier un commentaire.
Heureusement, il n'y a plus d'une manière explicitement l'ordre de vider les caches.
L'instruction "wbinvd", écrit arrière modifié en cache le contenu et les marques les caches vides. Il exécute un cycle de bus pour les caches de chasse de leurs données. Malheureusement, il est un lieu privilégié d'instruction. Mais si il est possible d'exécuter le programme d'essai en vertu de quelque chose comme le DOS, c'est le chemin à parcourir. Cela a l'avantage de garder la mémoire cache de l'empreinte de la "OS" très petites.
En outre, il est "invd" de l'enseignement, ce qui invalide les caches sans rinçage de les ramener à la mémoire principale. Cela porte atteinte à la cohérence de la mémoire principale et la mémoire cache, de sorte que vous avez à prendre soin de tout cela par vous-même. Pas vraiment recommandé.
À des fins d'étalonnage, la solution la plus simple est probablement la copie d'un gros bloc de mémoire à une région marquée avec WC (la combinaison d'écriture) à la place de la BM. La mémoire mappée région de la carte graphique est un bon candidat, ou vous pouvez marquer une région WC par vous-même via les MTRR registres.
Vous pouvez trouver quelques ressources sur l'analyse comparative court routines à Des programmes de Test pour la mesure de cycles d'horloge et de suivi de la performance.
wbinvd
à l'intérieur de virtual8086 mode (par exemple, un programme DOS, sous un Windows 32 bits) influent sur le PROCESSEUR de l'hôte?cli
obtient virtualisé comme les autres privilégié des instructions. (Et BTW,invd
est plus que juste "pas vraiment recommandé", à moins que l'euphémisme est de l'humour. Vous ne doit pas utiliserinvd
sauf pour les cas comme laissant cache-comme-mode RAM; un gestionnaire d'interruption pourrait avoir juste salis cache quelques cycles avant de l'exécuter sur une autre base, à l'origine de corrompre le système d'exploitation de l'état en supprimant ce magasin.)Il y a x86 instructions de montage pour forcer le CPU à vider certaines lignes de cache (comme CLFLUSH), mais ils sont assez obscures. CLFLUSH en particulier, seuls les bouffées de chaleur choisi à l'adresse de L1 caches.
Oui, c'est l'approche la plus simple, et assurez-vous que le CPU bouffées de chaleur tous les niveaux de cache. Juste exclure le cache de rinçage temps de votre benchmakrs et vous devriez avoir une bonne idée de comment votre programme effectue sous pression sur le cache.
Il n'y a malheureusement aucun moyen explicitement vider le cache. Quelques-uns de vos options sont les suivantes:
1.) Thrash le cache en faisant quelques très grandes opérations de mémoire entre les itérations du code que vous avez de l'analyse comparative.
2.) Activer le Cache Désactiver dans le x86 Registres de Contrôle et la référence. Ce sera probablement désactiver le cache d'instructions, qui peuvent ne pas être ce que vous voulez.
3.) Mettre en œuvre la partie de votre code votre le benchmarking (si c'est possible) à l'aide de Non-Temporelle des instructions. Cependant, ce sont juste conseils pour le processeur sur l'utilisation du cache, il est encore libre de faire ce qu'il veut.
1 est probablement la méthode la plus simple et suffisante pour vos besoins.
Modifier: Oups, je corrige la position des mains il y a une instruction pour invalider le x86 cache, voir drhirsch la réponse de
movntdqa
charges ne sont spéciaux lors de la lecture de WC mémoire, pas normal write-back (WB) les régions de mémoire. (Le manuel dit le NT indicateur peut être ignorée; c'est le cas sur toutes les implémentations actuelles, sauf pour la lecture de WC de la mémoire, par exemple pour la copie à partir de la vidéo de la RAM pour la mémoire principale.)La d'instructions x86
WBINVD
écrit arrière et annule tous les caches. Il est décrit comme:Important encore, l'instruction peut être exécutée seulement en ring0, c'est à dire le système d'exploitation. Si vos programmes utilisateurs ne peuvent pas simplement l'utiliser. Sur Linux, vous pouvez écrire un module du noyau qui peut s'exécuter que l'instruction de la demande. En fait, quelqu'un l'a déjà écrit un tel module de noyau: https://github.com/batmac/wbinvd
Heureusement, le noyau du module code est vraiment minuscule, donc vous pouvez le vérifier avant le chargement de code à partir des étrangers sur internet dans votre noyau. Vous pouvez utiliser ce module (et de déclencher l'exécution de la
WBINVD
d'instruction), par la lecture de/proc/wbinvd
, par exemple viacat /proc/wbinvd
.Cependant, j'ai trouvé que cette instruction (ou au moins à ce module dans le noyau) est vraiment lent. Sur mon i7-6700HQ je l'ai mesuré à prendre 750µs! Ce nombre semble vraiment élevé pour moi, j'ai fait une erreur dans la mesure de ce-s'il vous plaît garder à l'esprit! L'explication de cette instruction, il suffit de dire: