W jaki sposób generalnie wykrywasz skojarzenie linii pamięci podręcznej z kodu trybu użytkownika?

Przygotowuję małą łatkęnarzędzie cachegrind / callgrind w valgrind który automatycznie wykryje, używając całkowicie ogólnego kodu, instrukcji procesora i konfiguracji pamięci podręcznej (w tej chwili tylko automatyczna konfiguracja x86 / x64 i inne architektury nie zapewniają konfiguracji typu CPUID dla kodu nieuprzywilejowanego). Kod ten będzie musiał zostać wykonany całkowicie w nieuprzywilejowanym kontekście, tj. W czystym kodzie trybu użytkownika. Musi być również przenośny w bardzo różnych implementacjach POSIX, więc grokking / proc / cpuinfo nie będzie działać, ponieważ jeden z naszych systemów docelowych nie ma czegoś takiego.

Wykrywanie częstotliwości procesora, liczby pamięci podręcznych, ich rozmiarów, a nawet rozmiaru linii pamięci podręcznej można wykonać przy użyciu 100% ogólnego kodu POSIX, który nie zawiera żadnych specyficznych dla CPU kodów (tylko wiele rozsądnych założeń, takich jak dodawanie dwie liczby razem, jeśli nie posiadają pamięci lub rejestrują przestoje zależności, prawdopodobnie zostaną wykonane w jednym cyklu). Ta część jest dość prosta.

Co nie jest takie proste i dlaczego pytam StackOverflow, to jak wykryć skojarzenie linii pamięci podręcznej dla danej pamięci podręcznej? Asocjatywność określa, ile miejsc w pamięci podręcznej może zawierać daną linię pamięci podręcznej z pamięci głównej. Widzę, że można wykryć skojarzenie pamięci podręcznej L1, ale pamięć podręczna L2? Z pewnością łączność L1 przeszkadza?

Doceniam, że jest to prawdopodobnie problem, którego nie można rozwiązać. Ale rzucam go na StackOverflow i mam nadzieję, że ktoś wie coś, czego nie wiem. Zauważ, że jeśli zawiedziemy tutaj, po prostu utrudnię kodowanie w domyślnej asocjatywności czterech sposobów, zakładając, że nie miałoby to wielkiego znaczenia dla wyników.

Dzięki,
Niall

questionAnswers(3)

yourAnswerToTheQuestion