2010-08-09 25 views
5

Possible en double:
CPU cache flushComment effacer le cache L1 et L2 CPU

Je suis en cours d'exécution d'une référence sur le serveur xeon, et je le répète les exécutions 2-3 fois. Je voudrais effacer le contenu de la cache dans L1 et L2 en répétant les exécutions. Pouvez-vous suggérer des méthodes pour le faire?

+4

Quelle architecture et système d'exploitation testez-vous? –

+0

Je suppose que faire d'autres choses aléatoires sur le serveur pour un miunute ou alors serait un peu brut? – Dentrasi

+0

Ma question est pourquoi voudriez-vous faire cela? –

Répondre

8

Essayez de lire des données de grande taille répétitives via la CPU (c'est-à-dire pas par DMA). Comme :

int main() { 
    const int size = 20*1024*1024; // Allocate 20M. Set much larger then L2 
    char *c = (char *)malloc(size); 
    for (int i = 0; i < 0xffff; i++) 
     for (int j = 0; j < size; j++) 
     c[j] = i*j; 
} 

Cependant Dépendant du serveur un plus grand problème peut être un cache de disque (en mémoire), puis de cache L1/L2. Sous Linux (par exemple) déposer à l'aide:

sync 
echo 3 > /proc/sys/vm/drop_caches 

Edit: Il est trivial de générer un grand programme qui ne fait rien:

#!/usr/bin/ruby 
puts "main:" 
200000.times { puts " nop" } 
puts " xor rax, rax" 
puts " ret" 

Courir plusieurs fois sous différents noms (code produit pas script) devrait faire le travail

+6

La plupart des processeurs modernes ont des caches d'instructions et de données distincts; tandis que le cyclisme à travers 20M de RAM pourrait nettoyer le cache de données; il ne touchera pas au cache d'instructions. De plus, il n'y a aucune garantie que le CPU utilisera tout son cache, il pourrait simplement réutiliser la même petite section en continu. –

+0

La solution est fondamentalement la même. Générez beaucoup de code et exécutez-le. –

+0

Les nouveaux processeurs vont reconnaître le motif et n'invalideront pas la ligne de cache existante; donc il utilisera seulement 2 (ou plus) lignes de cache pour votre programme. Si le cache est un facteur important mieux vaut simplement l'éteindre et ne pas l'utiliser. D'autre part; il ne fait probablement pas 2 hoots de différence en premier lieu. –

Questions connexes