internet Comment puis-je faire un vidage de cache CPU dans Windows x86?



vider le cache android (2)

Je suis intéressé à forcer un vidage du cache CPU dans Windows (pour des raisons d'étalonnage, je veux émuler en commençant par pas de données dans le cache de l'UC), de préférence une implémentation C de base ou un appel Win32.

Existe-t-il un moyen connu de faire cela avec un appel système ou même quelque chose d'aussi sournois que de dire un gros memcpy ?

Plate-forme Intel i686 (P4 et plus, ça va aussi).

https://ffff65535.com


Heureusement, il existe plusieurs façons de vider explicitement les caches.

L'instruction "wbinvd" réécrit le contenu du cache modifié et marque les caches vides. Il exécute un cycle de bus pour que les caches externes vident leurs données. Malheureusement, c'est une instruction privilégiée. Mais s'il est possible d'exécuter le programme de test sous quelque chose comme DOS, c'est la voie à suivre. Cela a l'avantage de garder l'empreinte du cache de "l'OS" très petite.

De plus, il y a l'instruction "invd", qui invalide les caches sans les renvoyer dans la mémoire principale. Cela viole la cohérence de la mémoire principale et du cache, vous devez donc vous en occuper seul. Pas vraiment recommandé.

À des fins d'analyse comparative, la solution la plus simple consiste probablement à copier un grand bloc de mémoire dans une région marquée avec WC (combinaison d'écriture) au lieu de WB. La région mappée en mémoire de la carte graphique est un bon candidat, ou vous pouvez marquer une région comme un WC par vous-même via les registres MTRR.

Vous pouvez trouver des ressources sur les routines courtes de benchmarking dans les programmes de test pour mesurer les cycles d'horloge et la surveillance des performances.


Il existe des instructions d'assemblage x86 pour forcer le processeur à vider certaines lignes de cache (telles que CLFLUSH ), mais elles sont plutôt obscures. CLFLUSH, en particulier, ne purge qu'une adresse choisie des caches L1.

quelque chose d'aussi sournois que de dire une grande copie?

Oui, c'est l'approche la plus simple, et assurez-vous que le CPU videra tous les niveaux de cache. Il suffit d'exclure le temps de vidage de la mémoire cache de vos benchmakrs et vous devriez avoir une bonne idée de la façon dont votre programme fonctionne sous la pression du cache.





cpu-cache