Instrukcja kontroli pamięci podręcznej

W informatyce instrukcja kontroli pamięci podręcznej jest wskazówką osadzoną w strumieniu instrukcji procesora , mającą na celu poprawę wydajności pamięci podręcznej sprzętu , z wykorzystaniem wcześniejszej wiedzy o wzorcu dostępu do pamięci dostarczonym przez programistę lub kompilator . Mogą zmniejszyć zanieczyszczenie pamięci podręcznej , zmniejszyć zapotrzebowanie na przepustowość, ominąć opóźnienia, zapewniając lepszą kontrolę nad zestawem roboczym . Większość instrukcji kontroli pamięci podręcznej nie wpływa na semantykę programu, chociaż niektóre mogą.

Przykłady

Kilka takich instrukcji, z wariantami, jest obsługiwanych przez kilka architektur zestawów instrukcji procesora , takich jak ARM , MIPS , PowerPC i x86 .

Wstępne pobieranie

Nazywany również dotykiem bloku pamięci podręcznej danych , efektem jest żądanie załadowania linii pamięci podręcznej powiązanej z danym adresem. Jest to wykonywane przez PREFETCH w zestawie instrukcji x86 . Niektóre warianty omijają wyższe poziomy hierarchii pamięci podręcznej , co jest przydatne w kontekście „przesyłania strumieniowego” danych, które są przeglądane raz, a nie przechowywane w zbiorze roboczym. Pobieranie z wyprzedzeniem powinno następować wystarczająco daleko w czasie, aby złagodzić opóźnienie dostępu do pamięci, na przykład w pętli przechodzącej przez pamięć liniowo. Wewnętrzna funkcja GNU Compiler Collection __builtin_prefetch może być użyta do wywołania tego w językach programowania C lub C++ .

Wstępne pobieranie instrukcji

Wariant pobierania z wyprzedzeniem dla pamięci podręcznej instrukcji.

Blok pamięci podręcznej danych przydziela zero

Ta wskazówka służy do przygotowania linii pamięci podręcznej przed całkowitym nadpisaniem zawartości. W tym przykładzie procesor nie musi niczego ładować z pamięci głównej . Efekt semantyczny jest równoważny wyrównaniu memsetu bloku o rozmiarze linii pamięci podręcznej do zera, ale operacja jest faktycznie bezpłatna.

Unieważniony blok pamięci podręcznej danych

Ta wskazówka służy do odrzucania wierszy pamięci podręcznej bez umieszczania ich zawartości w pamięci głównej. Należy zachować ostrożność, ponieważ możliwe są nieprawidłowe wyniki. W przeciwieństwie do innych wskazówek dotyczących pamięci podręcznej semantyka programu została znacznie zmodyfikowana. Jest to używane w połączeniu z alokacją zera do zarządzania danymi tymczasowymi. Oszczędza to niepotrzebną przepustowość pamięci głównej i zanieczyszczenie pamięci podręcznej.

Opróżnianie bloku pamięci podręcznej danych

Ta wskazówka wymaga natychmiastowej eksmisji linii pamięci podręcznej, robiąc miejsce dla przyszłych alokacji. Jest używany, gdy wiadomo, że dane nie są już częścią zestawu roboczego .

Inne wskazówki

Niektóre procesory obsługują wariant instrukcji ładuj-przechowuj , które również implikują wskazówki dotyczące pamięci podręcznej. Przykładem jest load last w zestawie instrukcji PowerPC , co sugeruje, że dane będą użyte tylko raz, tj. dana linia pamięci podręcznej może zostać wypchnięta na początek kolejki eksmisji, przy jednoczesnym utrzymaniu jej w użyciu, jeśli nadal jest bezpośrednio potrzebna.

Alternatywy

Automatyczne pobieranie z wyprzedzeniem

W ostatnim czasie instrukcje kontroli pamięci podręcznej stały się mniej popularne, ponieważ coraz bardziej zaawansowane projekty procesorów aplikacyjnych firm Intel i ARM poświęcają więcej tranzystorów na przyspieszanie kodu napisanego w tradycyjnych językach, np. wykonywanie automatycznego wstępnego pobierania ze sprzętem do wykrywania liniowych wzorców dostępu w locie. Jednak techniki mogą pozostać ważne dla procesorów zorientowanych na przepustowość, które mają inny kompromis między przepustowością a opóźnieniem i mogą preferować poświęcenie większej powierzchni jednostkom wykonawczym.

Pamięć Scratchpada

Niektóre procesory obsługują pamięć typu scratchpad , w której można umieszczać pliki tymczasowe, oraz bezpośredni dostęp do pamięci (DMA) w celu przesyłania danych do iz pamięci głównej w razie potrzeby. Takie podejście jest stosowane przez procesor Cell i niektóre systemy wbudowane . Umożliwiają one większą kontrolę nad ruchem i lokalizacją pamięci (ponieważ zestaw roboczy jest zarządzany przez jawne transfery) i eliminują potrzebę kosztownej spójności pamięci podręcznej w maszynie wielordzeniowej .

Wadą jest to, że wymaga znacznie innych technik programowania. Bardzo trudno jest zaadaptować programy napisane w tradycyjnych językach, takich jak C i C++, które przedstawiają programiście jednolity widok dużej przestrzeni adresowej (co jest iluzją symulowaną przez pamięci podręczne). Tradycyjny mikroprocesor może łatwiej uruchamiać starszy kod, który można następnie przyspieszyć za pomocą instrukcji kontroli pamięci podręcznej, podczas gdy maszyna oparta na notatniku wymaga dedykowanego kodowania od podstaw do nawet funkcji. Instrukcje kontroli pamięci podręcznej są specyficzne dla określonego rozmiaru linii pamięci podręcznej, który w praktyce może się różnić w zależności od generacji procesorów w tej samej rodzinie architektur. Pamięci podręczne mogą również pomóc w łączeniu odczytów i zapisów z mniej przewidywalnych wzorców dostępu (np. podczas mapowania tekstur ), podczas gdy DMA w notatniku wymaga przerobienia algorytmów w celu uzyskania bardziej przewidywalnych „liniowych” przejść.

Jako takie notatniki są generalnie trudniejsze w użyciu z tradycyjnymi modelami programowania, chociaż modele przepływu danych (takie jak TensorFlow ) mogą być bardziej odpowiednie.

Pobieranie wektorów

Procesory wektorowe (na przykład nowoczesne procesory graficzne (GPU) i Xeon Phi ) wykorzystują ogromną równoległość , aby osiągnąć wysoką przepustowość, jednocześnie pracując nad opóźnieniem pamięci (zmniejszając potrzebę pobierania z wyprzedzeniem). Wiele operacji odczytu jest wydawanych równolegle dla kolejnych wywołań jądra obliczeniowego ; obliczenia mogą zostać wstrzymane w oczekiwaniu na przyszłe dane, podczas gdy jednostki wykonawcze są przeznaczone do pracy na danych z poprzednich żądań, które już się pojawiły. Jest to łatwiejsze dla programistów do wykorzystania w połączeniu z odpowiednimi modelami programowania ( jądra obliczeniowe ), ale trudniejsze do zastosowania w programowaniu ogólnego przeznaczenia.

Wadą jest to, że wiele kopii stanów tymczasowych może być przechowywanych w lokalnej pamięci elementu przetwarzającego , oczekując na dane w locie.