Musisz wymyślić heurystykę wymuszającą 100% (lub bardzo bliską) pamięć podręczną (mając nadzieję, że masz kod operacji unieważniania pamięci podręcznej?) I 100% trafienie w pamięci podręcznej. Hurra, który działa na 1 poziomie pamięci podręcznej. Teraz, jak zrobić to samo dla poziomu 2 i 3?
Z całą powagą, zapewne nie jest sposobem, aby to zrobić w 100% wiarygodny bez specjalnego sprzętu i śladów podłączonych do procesora i pamięci, ale tutaj jest to, co chciałbym zrobić:
napisać „kilka” z rzeczy do 1 lokalizacji w pamięci - wystarczy, że możesz być pewny, że uderza on w pamięć podręczną L1 i nagrywać czas (co wpływa na pamięć podręczną, więc uważaj). Powinieneś zrobić ten zestaw zapisów bez gałęzi, aby spróbować pozbyć się niekonsekwencji przewidywania gałęzi. To najlepszy czas. Teraz, co jakiś czas, zapisuj dane wartości pamięci podręcznej w losowej, odległej lokalizacji w pamięci RAM na końcu swojej znanej lokalizacji i zapisz nowy czas. Mamy nadzieję, że trwa to dłużej. Rób to nagrywając różne czasy i miejmy nadzieję, że zobaczysz kilka czasów, które mają tendencję do grupowania się. Każda z tych grup "mogła" pokazywać taktowanie dla czasów synchronizacji L2, L3 i pamięci. Problem polega na tym, że wiele innych przeszkadza. System operacyjny może zmienić kontekst i zepsuć pamięć podręczną. Przerwanie może nadejść i przez twój czas wolny. Będzie dużo rzeczy, które mogą wyrzucić te wartości. Ale, miejmy nadzieję, dostaniesz wystarczająco dużo sygnału w swoich danych, aby sprawdzić, czy to działa.
Prawdopodobnie byłoby to łatwiejsze do zrobienia w prostszym, wbudowanym systemie typu, w którym system operacyjny (jeśli jest zainstalowany) nie będzie przeszkadzał.
Czy to możliwe? Pamięć podręczna nie jest pod Twoją kontrolą, nie masz możliwości sprawdzenia, kiedy dane są ładowane skąd. (Okej, może uda ci się prześledzić cache, ale domyślam się, że śledzenie wyników może wprowadzić w błąd wyniki.) – millimoose
może użyć rejestrów i mmap? Ale wydaje się to wysoce subiektywne (poza tym istnieją inne procesy uruchomione na komputerze). Brzmi jak coś, co należy zrobić na poziomie sprzętu; w przeciwnym razie inne wątki/procesy/OS-owskie staną się przeszkodą. – cegfault
O ile widzę, jeśli definiuję dużą tablicę w C, kiedy uzyskuję dostęp do elementu w tej tablicy, dane wokół tego elementu wydają się być przechowywane w Pamięć podręczna. Więc jeśli dostęp do tablicy od początku do końca będzie szybszy niż losowy dostęp (dostęp do każdego elementu raz) --- to prawda, ale nie wiem, że to wynik przez buforowanie lub coś innego. – Sayakiss