Zanieczyszczenie pamięci podręcznej - Cache pollution

Zanieczyszczenie pamięci podręcznej opisuje sytuacje, w których wykonujący program komputerowy niepotrzebnie ładuje dane do pamięci podręcznej procesora , powodując w ten sposób wyrzucenie innych użytecznych danych z pamięci podręcznej na niższe poziomy hierarchii pamięci , obniżając wydajność. Na przykład w procesorze wielordzeniowym jeden rdzeń może zastąpić bloki pobrane przez inne rdzenie we współdzielonej pamięci podręcznej lub bloki wstępnie pobrane mogą zastąpić bloki pobierane na żądanie z pamięci podręcznej.

Przykład

Rozważ następującą ilustrację:

 T[0] = T[0] + 1;
 for i in 0..sizeof(CACHE)
   C[i] = C[i] + 1;
 T[0] = T[0] + C[sizeof(CACHE)-1];

(Założenia są tutaj takie, że pamięć podręczna składa się tylko z jednego poziomu, jest odblokowana, polityka wymiany to pseudo-LRU , wszystkie dane są buforowalne, ustawiona asocjatywność pamięci podręcznej to N (gdzie N> 1) i co najwyżej dostępny jest jeden rejestr procesora zawierający wartości programu).

Tuż przed rozpoczęciem pętli T [0] zostanie pobrane z pamięci do pamięci podręcznej, a jego wartość zostanie zaktualizowana. Jednak gdy pętla jest wykonywana, ponieważ liczba elementów danych, do których odwołuje się pętla, wymaga wypełnienia całej pamięci podręcznej do jej pojemności, blok pamięci podręcznej zawierający T [0] musi zostać usunięty. Zatem następnym razem, gdy program zażąda aktualizacji T [0], pamięć podręczna chybi, a kontroler pamięci podręcznej musi zażądać, aby szyna danych ponownie przyniosła odpowiedni blok pamięci podręcznej z pamięci głównej .

W tym przypadku pamięć podręczna jest określana jako „zanieczyszczona”. Zmiana wzorca dostępu do danych poprzez umieszczenie pierwszej aktualizacji T [0] między pętlą a drugą aktualizacją może wyeliminować nieefektywność:

 for i in 0..sizeof(CACHE)
   C[i] = C[i] + 1;
 T[0] = T[0] + 1;
 T[0] = T[0] + C[sizeof(CACHE)-1];

Rozwiązania

Poza wspomnianą powyżej restrukturyzacją kodu, rozwiązaniem problemu zanieczyszczenia pamięci podręcznej jest zapewnienie, że w pamięci podręcznej przechowywane są tylko dane o wysokim stopniu ponownego wykorzystania. Można to osiągnąć za pomocą specjalnych instrukcji kontroli pamięci podręcznej , obsługi systemu operacyjnego lub obsługi sprzętu.

Przykłady wyspecjalizowanych instrukcji sprzętowych obejmują „lvxl” dostarczane przez PowerPC AltiVec . Ta instrukcja ładuje do rejestru wartość o szerokości 128 bitów i oznacza odpowiedni blok pamięci podręcznej jako „ostatnio używany”, tj. Jako główny kandydat do eksmisji w przypadku konieczności usunięcia bloku z jego zestawu pamięci podręcznej. Aby właściwie użyć tej instrukcji w kontekście powyższego przykładu, elementy danych, do których odwołuje się pętla, musiałyby zostać załadowane za pomocą tej instrukcji. Przy takiej implementacji zanieczyszczenie pamięci podręcznej nie miałoby miejsca, ponieważ wykonanie takiej pętli nie spowodowałoby przedwczesnego usunięcia T [0] z pamięci podręcznej. Można by tego uniknąć, ponieważ w miarę postępu pętli adresy elementów w C odwzorowywałyby się w ten sam sposób w pamięci podręcznej, pozostawiając faktycznie starsze (ale nie oznaczone jako „najdawniej używane”) dane nienaruszone w inny sposób ). Tylko najstarsze dane (nieistotne dla podanego przykładu) zostałyby usunięte z pamięci podręcznej, do której T [0] nie należy, ponieważ ich aktualizacja następuje tuż przed rozpoczęciem pętli.

Podobnie, korzystając z obsługi systemu operacyjnego (OS), strony w pamięci głównej, które odpowiadają tablicy danych C, mogą być oznaczone jako „wstrzymane buforowanie” lub, innymi słowy, nie mogą być buforowane. Podobnie na poziomie sprzętu można zastosować schematy omijania pamięci podręcznej, które identyfikują dane o niskim stopniu ponownego wykorzystania na podstawie wzorca dostępu do programu i omijają je z pamięci podręcznej. Ponadto współużytkowaną pamięć podręczną można podzielić na partycje, aby uniknąć destrukcyjnych zakłóceń między uruchomionymi aplikacjami. Kompromisem w tych rozwiązaniach jest to, że schematy oparte na systemie operacyjnym mogą mieć duże opóźnienia, które mogą zniweczyć zysk osiągalny przez unikanie zanieczyszczenia pamięci podręcznej (chyba że region pamięci nie był początkowo buforowany), podczas gdy techniki oparte na sprzęcie mogą nie mieć globalnego widok przepływu sterowania programem i wzorca dostępu do pamięci .

Rosnące znaczenie

Kontrola zanieczyszczenia pamięci podręcznej zyskuje na znaczeniu, ponieważ stale rosną kary spowodowane tak zwaną „ ścianą pamięci ”. Producenci chipów nadal opracowują nowe sztuczki, aby przezwyciężyć stale rosnące względne opóźnienia między pamięcią a procesorem. Robią to, zwiększając rozmiary pamięci podręcznej i zapewniając inżynierom oprogramowania przydatne sposoby kontrolowania sposobu, w jaki dane docierają i pozostają w procesorze. Kontrola zanieczyszczenia pamięci podręcznej jest jednym z wielu urządzeń dostępnych dla (głównie wbudowanego) programisty. Jednak inne metody, z których większość jest zastrzeżona i wysoce specyficzna dla sprzętu i aplikacji, są również używane.

Bibliografia