2009-03-25 15 views
6

System operacyjny może określić, czy strona pamięci znajduje się w pamięci DRAM, czy w swapach; na przykład po prostu spróbuj uzyskać do niego dostęp i jeśli wystąpi błąd strony, nie było.Ustal, czy lokalizacja pamięci znajduje się w pamięci podręcznej CPU

Czy to samo możliwe z pamięcią podręczną procesora?

Czy istnieje skuteczny sposób określenia, czy dana lokalizacja pamięci została załadowana do linii pamięci podręcznej, czy też wiedzieć, kiedy to zrobi?

Odpowiedz

6

Ogólnie nie sądzę, że jest to możliwe. Działa dla DRAM i pliku stronicowania, ponieważ jest to zasób zarządzany przez system operacyjny, pamięć podręczna jest zarządzana przez sam procesor.

System operacyjny mógłby wykonać wąską pętlę taktowania odczytanej pamięci i spróbować sprawdzić, czy jest wystarczająco szybki, aby znaleźć się w pamięci podręcznej, czy też musiał wyjść do pamięci głównej - byłby bardzo podatny na błędy.

W systemach wielordzeniowych/wielu procesach są używane cache coherency protocols używane między procesorami w celu określenia, kiedy należy unieważnić pamięć podręczną drugiej strony, przypuszczam, że można mieć niestandardowe urządzenie, które mogłoby podsłuchać ten protokół, który system operacyjny zapytał.

Co próbujesz zrobić? Jeśli chcesz wymusić coś w pamięci, obecne procesory x86 obsługują pobieranie wstępnie pamięci w pamięci podręcznej w sposób nieblokujący, na przykład w Visual C++ możesz użyć _mm_prefetch, aby pobrać linię do pamięci podręcznej.

EDYCJA: Nie zrobiłem tego sam, więc używaj na własne ryzyko. Aby określić chybienia pamięci podręcznej do profilowania, możesz użyć niektórych rejestrów specyficznych dla architektury. http://download.intel.com/design/processor/manuals/253669.pdf, Dodatek A podaje "Wydajność dostrajania wydajności". Nie można tego użyć do określenia, czy indywidualny adres znajduje się w pamięci podręcznej lub kiedy jest on załadowany do pamięci podręcznej, ale można go wykorzystać do ogólnych statystyk. Wierzę, że właśnie to wykorzystuje vTune (fenomenalny profiler dla tego poziomu).

+0

Dzięki. Jestem zainteresowany tym, że bawię się pisząc jądra. Interesuje mnie profilowanie chybienia linii cache na rzeczywistym sprzęcie. Nie zdawałem sobie sprawy, jak bardzo szkodliwe są one na nowoczesnych procesorach, dopóki nie zobaczyłem slajdów Suttera: http://is.gd/oWwp –

+0

Istnieją sposoby na profilowanie tego w sprzęcie, co robi vtune. – Michael

+0

Wiele nowoczesnych procesorów ma liczniki wydajności, które mogą dostarczać wszelkiego rodzaju informacje, w tym statystyki dotyczące pamięci podręcznej. – sigjuice

6

Jeśli spróbujesz ustalić to samodzielnie, sam akt uruchomienia programu może unieważnić odpowiednie linie pamięci podręcznej, co spowoduje, że twoje pomiary będą bezużyteczne.

Jest to jeden z przypadków, który odzwierciedla naukową zasadę, że nie można zmierzyć czegoś bez wpływu na to, co mierzysz.

+0

Cóż, bardzo łatwo jest sprawdzić, czy lokalizacja * jest * w pamięci podręcznej. Po prostu przeczytaj z niego, a voila, będzie w pamięci podręcznej. ;) Sztuką jest sprawdzenie, czy coś jest * nie * w pamięci podręcznej. :) – jalf

+1

Jeśli upewnisz się, że twój kod jest uruchomiony z pamięci nieobsługiwanej, sam akt uruchomienia programu nie wpłynie na pamięć podręczną. –

+0

Dobre punkty. Zasadniczo musiałbym uwzględnić wszystko inne, co może się zdarzyć, aby wiedzieć, czy pamięć podręczna chybień nie załadowała danej pamięci. –

1

X86 nie wiem jak to powiedzieć, jeśli adres znajduje się w pamięci podręcznej ale tutaj jest jak sprawdzić, czy adres został w pamięci podręcznej

rdtsc 
save timestamp 
mov eax,address 
rdtsc read timestamp counter 
calculate timestamp difference 
if < threshold then was in cache 

próg musi być określony w dokumentacji lub empirycznie

niektóre maszyny mają liczniki trafień/pomyłek w pamięci podręcznej, które będą równie dobrze służyć

Powiązane problemy