2013-06-30 6 views
5

Interesuje mnie dopracowanie struktur danych świadomych pamięci podręcznej (patrz na przykład drzewo przeskoków bez blokady w Michael Spiegel's dissertation lub Herlihy et al's hopscotch hashing), jak również w zapobieganiu false sharing, np. podczas współbieżnego przetwarzania tablic. Już wiem, jak znaleźć rozmiar wskaźnika JVM za pośrednictwem właściwości "sun.arch.data.model", ale nie udało mi się znaleźć sposobu określenia rozmiaru linii pamięci podręcznej w pamięci podręcznej L1.Jak znaleźć rozmiar linii pamięci podręcznej L1 z procesu Java?

Należy zauważyć, że ta informacja nie jest krytyczna, ponieważ mogę po prostu kontynuować stosowanie konserwatywnych szacunków dla rozmiaru wiersza L1 (64 bajty podczas dostrajania struktur danych świadomych pamięci podręcznej lub 256 bajtów przy zapobieganiu fałszywemu współdzieleniu); jeśli jednak łatwo jest uzyskać właściwości pamięci podręcznej L1, to równie dobrze mogę z nich skorzystać.

+0

Myślę, że to (bardzo interesujące, powiedziałbym nawet ekscytujące) zadanie kosztowałoby zbyt wiele do wdrożenia. Zrobiłbym tu leniwy: rozmiary pamięci podręcznej dla modeli procesorów i ustalenie tego - jak to może być łatwiejsze. Może się to jednak nie powieść, jeśli wirtualna maszyna wirtualna jest uruchomiona w maszynie wirtualnej, która ukrywa rzeczywisty model procesora, podczas gdy rozwiązanie będzie używało prawidłowych rozmiarów dla tego scenariusza ... – ppeterka

+0

Wielkość linii to wielkość linii; w jakim sensie jest to zawsze 64 ** i ** 256? –

+0

@OliCharlesworth Jeśli nie znam dokładnego rozmiaru linii, używam różnych szacunków w zależności od tego, co próbuję osiągnąć, np. jeśli dopracowuję strukturę danych świadomej pamięci podręcznej, użyję niższej estymacji 64 bajtów, ponieważ w ten sposób struktura danych będzie nadal działać poprawnie, jeśli rzeczywisty rozmiar linii jest większy niż 64 bajty, a jeśli jestem zapobiegając fałszywemu współudziałowi, użyję wyższego oszacowania 256 bajtów, ponieważ będzie on nadal działał dobrze, jeśli rzeczywisty rozmiar linii jest mniejszy niż 256 bajtów. –

Odpowiedz

1

Zaprogramowałem małą bibliotekę dla języka Java o nazwie CacheSize, która obecnie obsługuje tylko procesor Intel. Można uzyskać dostęp do wszystkich informacji na różnych poziomach pamięci podręcznej:

  • cache rozmiar linia
  • numery zestawów/linii
  • associativy
  • ...

strona jest here. Dostępne również za pośrednictwem Maven Central.

0

Co można zrobić, to prosta pętla, która odczytuje pojedyncze bajty z pamięci w danym kroku. jeśli krok wynosi 1 (bajt), to będziesz musiał zapłacić karę pobrania linii po każdej iteracji. jeśli podwoisz przeskok, możesz oczekiwać połowy wydajności, ponieważ teraz pobierasz dwukrotnie linię na tę samą liczbę iteracji.

Po osiągnięciu wielkości pamięci podręcznej krokami, powinieneś zobaczyć perf degradację, ponieważ osiągniesz poziom, na którym pobierasz linię raz na iterację, a podwojenie kroku znowu tego nie zmieni, ty " d tylko pomiń linie. Jednym z problemów jest to, że możesz uruchamiać preselektory strumienia HW w twoim procesorze i mieć linie czekające na ciebie z wyprzedzeniem na niższym poziomie pamięci podręcznej, więc spodziewałbym się, że nachylenie zmniejszy się, ale nie wyprostuje się całkowicie. Przy dwukrotnym przekroczeniu rozmiaru linii pamięci podręcznej może to zniknąć, ponieważ możesz wstrząsnąć niektórymi preselektorami strumieni, będąc szybszymi od nich (nadal mogą być "pomocnicy" krok dalej, ale wpływ powinien być znacznie mniejszy).

Należy również pamiętać, że kod powinien działać w zestawie danych (np. Tablica) większym niż pamięć podręczna ostatniego poziomu, wystarczy kilka MB.