2010-08-09 17 views
5

Olası Çoğalt temizlemek için:
CPU cache flushNasıl CPU L1 ve L2 önbelleği

Ben xeon sunucusunda bir kriter çalıştırıyorum ve ben infazlar 2-3 kez tekrarlayın. Çalışmaları tekrar ederken L1 ve L2'deki önbellek içeriğini silmek istiyorum. Bunu yapmak için herhangi bir yöntem önerebilir misiniz?

+4

Hangi mimariyi ve işletim sistemini test ediyorsunuz? –

+0

Sunucuda bir miunut için başka rastgele şeyler yapmak isterim, ya da biraz daha ham olurdu? – Dentrasi

+0

Sorumu, neden bunu yapmak istersiniz? Ben hafıza ve önbellek davranışı üzerindeki veri toplamak için bir kereden fazla kriter koşuyorum –

cevap

8

CPU ile repetitly büyük veri (yani yok DMA ile) okumak için deneyin. gibi:

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; 
} 

Ancak sunucusuna bağlıdır

daha büyük bir sorun (bellekte) disk önbellek sonra, L1/L2 önbellek olabilir. Linux'ta (örneğin) kullanarak damla:

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

Düzenleme: O hiçbir şey büyük bir programı oluşturmak için Önemsiz: Farklı isimler altında birkaç kez Koşu

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

(kod değil üretilen script) iş yapmalı

+6

Çoğu modern CPU'nun ayrı Eğitim ve Veri önbellekleri vardır; 20M RAM ile bisiklet sürerken veri önbelleğini temizleyebilir; talimat önbelleğine dokunmayacak. Ek olarak, CPU'nun tüm önbelleğini kullanacağına dair bir garanti yoktur, aynı küçük bölümü sürekli olarak tekrar kullanabilir. –

+0

Çözüm temelde aynıdır. Çok fazla kod üretin ve çalıştırın. –

+0

Daha yeni işlemciler kalıbı tanıyacak ve varolan önbellek çizgisini geçersiz kılmayacak; Bu yüzden programınız için sadece 2 (veya daha fazla) önbellek satırı kullanacaktır. Önbellek büyük bir faktör ise; Sadece kapatmak ve kullanmak için daha iyi. Diğer yandan; Muhtemelen ilk etapta 2 fark farketmez. –

İlgili konular