2011-12-12 29 views
5

Prowadziłem testy porównawcze niektórych algorytmów i profilowania ich wykorzystania pamięci i wydajności (L1/L2/TLB uzyskuje dostęp i pomyłki), a niektóre wyniki są dla mnie dość intrygujące.Kiedy brakuje L1 są dużo inne niż dostęp L2 ... związane z TLB?

Zważywszy integracyjnego hierarchię pamięci podręcznej L1 i L2 (buforuje), nie powinny liczba L1 cache strzela pokrywa się z liczbą pamięci podręcznej L2 uzyskuje dostęp? Jednym z wyjaśnień, które znajduję, jest powiązanie TLB: gdy adres wirtualny nie jest odwzorowany w TLB, system automatycznie pomija wyszukiwania na niektórych poziomach pamięci podręcznej. Czy wydaje się to uzasadnione?

Odpowiedz

6

Po pierwsze, hierarchie z włączonymi zbiorami pamięci podręcznej mogą nie być tak powszechne, jak zakładasz. Na przykład, nie sądzę, że jakiekolwiek obecne procesory Intela - nie Nehalem, nie Sandybridge, ewentualnie Atomy - mają L1, który jest zawarty w L2. (Nehalem i prawdopodobnie Sandybridge mają jednak L1 i L2 zawarte w L3, używając aktualnej terminologii Intela, FLC i MLC w LLC.)

Ale to nie musi mieć znaczenia. W większości hierarchii pamięci podręcznej, jeśli brakuje pamięci podręcznej L1, to ta luka zostanie prawdopodobnie wyświetlona na L2. Nie ma znaczenia, czy jest to włączanie czy nie. Aby zrobić inaczej, musiałbyś mieć coś, co powiedziałoby ci, że dane, na których Ci zależy, są (prawdopodobnie) nie w L2, nie musisz szukać. Chociaż zaprojektowałem protokoły i typy pamięci, które to umożliwiają - np. typ pamięci, który jest buforowany tylko w L1, ale nie w L2, użyteczny w takich rzeczach jak grafika, gdzie można uzyskać korzyści z łączenia w L1, ale gdzie wielokrotnie skanujesz dużą tablicę, więc buforowanie w L2 nie jest dobrym pomysłem . Trochę nie jestem świadomy, że ktokolwiek wysyła je w tej chwili.

W każdym razie, oto kilka powodów, dla których liczba błędów w pamięci podręcznej L1 może nie być równa liczbie dostępów do pamięci podręcznej L2.

Nie mówisz, nad którymi systemami pracujesz - wiem, że moja odpowiedź dotyczy komputerów z procesorem Intel x86, takich jak Nehalem i Sandybridge, których monitorowanie zdarzeń wydajnościowych EMON pozwala ci liczyć na takie rzeczy, jak pomyłki w pamięci podręcznej L1 i L2 itp. Prawdopodobnie dotyczy to również każdego nowoczesnego mikroprocesora ze sprzętowymi licznikami wydajności dla pominięć pamięci podręcznej, takich jak na ARM i Power.

Większość nowoczesnych mikroprocesorów nie zatrzymuje się przy pierwszym braku pamięci podręcznej, ale kontynuuje próbę wykonania dodatkowej pracy. Jest to ogólnie nazywane spekulacyjnym wykonaniem. Ponadto procesor może być w kolejności lub poza kolejnością, ale chociaż ten ostatni może dać jeszcze większe różnice między liczbą braków L1 i liczbą dostępów L2, nie jest to konieczne - można uzyskać to zachowanie nawet przy zamów procesory.

Krótka odpowiedź: wiele z tych spekulatywnych dostępów do pamięci będzie znajdować się w tej samej lokalizacji pamięci. Zostaną zgniecione i połączone.

Wydarzenie "brak pamięci podręcznej L1" prawdopodobnie [*] zlicza liczbę (spekulatywnych) instrukcji, które pominęły pamięć podręczną L1. Które następnie przydzielają strukturę danych sprzętowych, zwaną w Intel buforem do wypełniania, w niektórych innych miejscach rejestru utraty statusu. Kolejne pomyłki w pamięci podręcznej, które mają tę samą linię pamięci podręcznej, będą pomijane w pamięci podręcznej L1, ale trafią w bufor wypełnienia i zostaną zgniecione. Tylko jeden z nich, zazwyczaj pierwszy, zostanie wysłany do L2 i zliczony jako dostęp L2.)

Przy okazji może zdarzyć się wydarzenie wydajnościowe: Squashed_Cache_Misses.

([*] Przy okazji, kiedy mówię "prawdopodobnie" tutaj mam na myśli "Na maszynach, które pomogłem zaprojektować." Prawie definitywnie, może będę musiał sprawdzić definicję, spojrzeć na RTL, ale chciałbym być niezmiernie zaskoczony, jeśli nie, to prawie gwarantowane.)

E.g. wyobraź sobie, że masz dostęp do bajtów A [0], A [1], A [2], ... A [63], A [64], ...

Jeśli adres A [0] jest równy zero modulo 64, a następnie A [0] .. A [63] będzie znajdować się w tej samej linii pamięci podręcznej na maszynie z 64-bajtowymi liniami pamięci podręcznej. Jeśli kod, który z nich korzysta jest prosty, jest całkiem możliwe, że wszystkie z nich mogą być wydane spekulatywnie. QED: 64 spekulacyjny dostęp do pamięci, brak pamięci podręcznej 64 L1, ale tylko jeden dostęp do pamięci L2.

(.. Przy okazji, nie oczekuj numery być aż tak czyste Możesz nie dostać dokładnie 64 L1 dostęp za dostęp L2)

Nieco więcej możliwości:

Jeżeli liczba Dostęp do L2 jest większy niż liczba pomyłek pamięci podręcznej L1 (prawie nigdy go nie widziałem, ale jest to możliwe), że możesz mieć wzorzec dostępu do pamięci, który mylnie z prefetcherem sprzętowym. Sprzętowy prefekser próbuje przewidzieć, które linie pamięci podręcznej będą potrzebne. Jeśli prefetcher przewiduje źle, może pobrać linie pamięci podręcznej, których faktycznie nie potrzebujesz. Często jest wydajność do zliczania Prefetches_from_L2 lub Prefetches_from_Memory.

Niektóre urządzenia mogą anulować dostęp spekulacyjny, który spowodował brak pamięci podręcznej L1, zanim zostaną wysłane do L2. Jednak nie wiem, czy Intel to robi.

+0

Pilingowanie: być może przyglądasz się licznikowi wydajności, takim jak L1_DCACHE_MISSES_RETIRED. Możliwe, że błędne instrukcje dotyczące ścieżki mogły wywołać wypełnienia pamięci podręcznej L1 i/lub L2 - możesz więc nigdy nie zobaczyć pominiętej pamięci podręcznej L2 "wycofanej". –

1

Zasady zapisu danych w pamięci podręcznej określają, czy zapisywanie w pamięci sklepu zapisuje dane tylko w tej pamięci podręcznej (odpisywanie lub kopiowanie), czy też na następującym poziomie hierarchii pamięci podręcznej (nadpisywanie). W związku z tym sklep, który trafia na pamięć podręczną L1-D zapisu, również zapisuje swoje dane w pamięci podręcznej L2.

To może być kolejne źródło dostępu L2, które nie pochodzi z błędów pamięci podręcznej L1.