Witamy na wszystkich platformach, proszę określić platformę dla swojej odpowiedzi.
Podobne pytanie: Jak programowo uzyskać rozmiar strony pamięci podręcznej procesora w C ++?
c++
c
caching
operating-system
systems-programming
paxos1977
źródło
źródło
SDL_GetCPUCacheLineSize
funkcji SDL2 , a następnie przyjrzeć się,cpuid macro
który ma kod źródłowy asemblera dla każdego modelu procesora. Możesz zajrzeć na stronę imgur.com/a/KP57m6s lub bezpośrednio zerknąć na źródło.Odpowiedzi:
W Linuksie (z całkiem nowym jądrem) możesz pobrać te informacje z / sys:
Ten katalog ma podkatalog dla każdego poziomu pamięci podręcznej. Każdy z tych katalogów zawiera następujące pliki:
Daje to więcej informacji o pamięci podręcznej, niż kiedykolwiek miałbyś nadzieję, w tym rozmiar cacheline (
coherency_line_size
), a także to, które procesory współużytkują tę pamięć podręczną. Jest to bardzo przydatne, jeśli robisz programowanie wielowątkowe z udostępnionymi danymi (uzyskasz lepsze wyniki, jeśli wątki udostępniające dane również współużytkują pamięć podręczną).źródło
cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size
wraca64
do mojego systemu. To samo dotyczy folderów index1,2,3.W Linuksie spójrz na sysconf (3).
Możesz go również pobrać z wiersza poleceń za pomocą getconf:
źródło
Pracowałem nad pewnymi kwestiami dotyczącymi linii pamięci podręcznej i potrzebowałem napisać funkcję międzyplatformową. Przekazałem to do repozytorium github pod adresem https://github.com/NickStrupat/CacheLineSize lub możesz po prostu użyć źródła poniżej. Możesz z nim robić, co chcesz.
źródło
Na x86 można użyć instrukcji CPUID z funkcją 2 do określenia różnych właściwości pamięci podręcznej i TLB. Przetwarzanie danych wyjściowych funkcji 2 jest nieco skomplikowane, dlatego odsyłam do sekcji 3.1.3 dotyczącej identyfikacji procesora Intel i instrukcji CPUID (PDF).
Aby uzyskać te dane z kodu C / C ++, musisz użyć zestawu wbudowanego, elementów wewnętrznych kompilatora lub wywołać zewnętrzną funkcję asemblera w celu wykonania instrukcji CPUID.
źródło
Jeśli używasz SDL2, możesz użyć tej funkcji:
Zwraca rozmiar linii pamięci podręcznej L1 w bajtach.
Na moim komputerze x86_64 uruchamiam ten fragment kodu:
Produkuje
CacheLineSize = 64
Wiem, że jestem trochę spóźniony, ale dodam tylko informacje dla przyszłych gości. Dokumentacja SDL mówi obecnie, że zwracana liczba jest w KB, ale w rzeczywistości jest to w bajtach.
źródło
Na platformie Windows:
z http://blogs.msdn.com/oldnewthing/archive/2009/12/08/9933836.aspx
źródło
ARMv6 i nowsze wersje mają
C0
lub Rejestr typu pamięci podręcznej. Jednak jest dostępny tylko w trybie uprzywilejowanym.Na przykład w Podręczniku technicznym Cortex ™ -A8 :
Nie zakładaj, że procesor ARM ma pamięć podręczną (najwyraźniej niektóre można skonfigurować bez niej). Standardowym sposobem określenia tego jest metoda
C0
. Z ARM ARM , strona B6-6:źródło
Możesz również spróbować zrobić to programowo, mierząc czas. Oczywiście nie zawsze będzie tak precyzyjny jak cpuid i tym podobne, ale jest bardziej przenośny. ATLAS robi to na etapie konfiguracji, warto się temu przyjrzeć:
http://math-atlas.sourceforge.net/
źródło