2014-10-29 15 views
6

Tak więc otrzymaliśmy zlecenie na skompilowanie kodu (powinniśmy traktować go jako czarną skrzynkę), używając różnych flag optymalizujących kompilator intel (-O1 i -O3) oraz flagi wektoryzacja (-xhost i -no-Vec) i obserwować zmiany w:Efekt optymalizacji kompilatora na FLOP i L2/L3 Miss Rate przy użyciu PAPI

  • czas realizacji
  • zmiennoprzecinkowe operacje (FPOs)
  • L2 i L3 Cache Miss Rate

Po wykonaniu tych optymalizacji zauważyliśmy spadek czasu wykonania, którego należało się spodziewać, biorąc pod uwagę wszystkie zmiany, jakie kompilator wprowadza do kodu w celu zwiększenia wydajności. Zauważyliśmy jednak spadek liczby FPO, które, choć rozumiemy, że to dobrze, nie jesteśmy pewni, dlaczego tak się stało. Ponadto zauważyliśmy (i nie możemy wyjaśnić) wzrost L2 Cache Miss Rate (rosnący wraz ze wzrostem poziomu optymalizacji), ale bez znaczącego zwiększenia dostępu do pamięci podręcznej i prawie żadnych zmian na poziomie L3.

Bez użycia wektoryzacji lub optymalizacji uzyskano najlepszy wynik pod względem współczynnika Miss Cache L2 i zastanawialiśmy się, czy moglibyśmy dać nam pewien wgląd, a także obsługiwaną dokumentację, literaturę i zasoby, z których możemy skorzystać pogłębić naszą wiedzę na ten temat.

Dziękuję.

edit: Opcje kompilatora stosowane są:

  • O0 -no-vec (Najwyższy czas realizacji, Najniższe L2 Cache) Misses
  • O1 (mniej czasu realizacji, Wyższe L2 Cache) Misses
  • O3 (Nawet mniej czasu realizacji, jeszcze wyższy L2 Cache) Misses
  • xhost (ta sama kolejność -O3 czasu wykonania, najwyższy L2 Cache) pannami

Aktualizacja:

Chociaż występuje niewielki spadek liczby dostępów do pamięci podręcznej L2, istnieje ogromny wzrost rzeczywistych braków.

Z -0O -no-vec

ścienny zegar w usecs: 13.957.075

  • L2 cache chybienia: 207.460.564
  • cache L2 odwiedziny: 1.476.540.355
  • L2 cache miss stawka: 0,140504
  • Brak pamięci podręcznej L3: 24,841,999
  • Dostęp do pamięci podręcznej L3: 207,460,564
  • Współczynnik miss pamięci podręcznej L3: 0.119743

Z -xhost

ścienny zegar w czasie usecs: 4,465,243

  • L2 cache strzela: 547.305.377
  • cache L2 dostępów: 1.051.949.467
  • L2 cache miss stawka: 0,520277
  • L3 cache chybienia: 86919153
  • L3 cach e dostępów: 547.305.377
  • L3 szybkość cache miss: 0,158813
+0

Czy możesz przekazać nam kompilator i * wszystkie * opcje przekazane? Poza tym, co do tej pory myślałeś? – edmz

+0

Czy spojrzałeś na wygenerowany kod zespołu (np. Z flagą 'gcc -Wall -fverbose-asm -S' i optymalizacją)? –

+0

Możesz spojrzeć na kod źródłowy kompilatora. –

Odpowiedz

2

Na zmniejszenie liczby OPS zmiennoprzecinkowych:
z optymalizacją, kompilator może wciągnik wspólnych obliczeń z pętlami, stałe bezpieczników, wstępnie obliczyć wyrażenia i tak dalej.

Na zwiększone cache miss-kursu:
Jeśli kompilator używa wektoryzacji i ładuje pełnej szerokości wektora wartości danych za każdym razem, używa dużo mniej ładunki z pamięci w całości. Ale za każdym razem, gdy uzyskuje dostęp do pamięci podręcznej w sposób, jakiego nie przewidział przewidujący, nadal powoduje brak pamięci podręcznej.
Razem, masz mniej obciążeń, ale o taką samą liczbę cachelines dotknął, więc stopaod pomyłek może być wyższa.

+0

Zaktualizowałem pytanie, aby podać więcej informacji. – kfkhalili

2

Odpowiedź EOF ma dobre wyjaśnienie dla mniejszej liczby operacji zmiennoprzecinkowych: -ffast-math łączenie stylów operacji, więc odpowiem tylko na drugą część.


Pytanie nie ma informacji o tym, co CPU mikroarchitektury był używany, ale przynajmniej jest to oznaczone .

Intel procesorów jest logicznym wstępne pobieranie w L1, a bardziej zaawansowaną logikę wstępne pobieranie się L2 (L3 lub z pamięci głównej). Każdy rdzeń ma swój własny L2, ale niższe poziomy hierarchii pamięci podręcznej są udostępniane, więc jest to oczywiste miejsce do umieszczenia głównej logiki prefetch.

Jeśli czytasz wolniej niż granicach przepustowości pamięci, ładuje się trafi w L2, ponieważ sprzęt Prefetcher będzie już pobrane te linie do L2. Jeśli pobieranie wstępne nie nadąża, dostaniesz pamięć podręczną L2.

Coraz szersze ładunki zamiast wielu skalarnych ładunku oznacza także Miss% będzie gorzej z wektorami. (Odpowiedź EOF już to ujęła). Efekt ten nie tłumaczy wzrostu bezwzględnej liczby braków L2, ale jedynie (części) zmiany%. Nadal ważne, o czym należy pamiętać, patrząc na dane.


Od przewodnika Intela optymalizacji (linki na wiki tag), Sekcja 2.3.5.4: Dane Wstępne pobieranie:

dane Prefetch do L2 Cache i ostatni poziom

Streamer: Ten program do odczytu wstępnego monitoruje żądania odczytu z pamięci podręcznej L1 na rosnące i malejące sekwencje adresów ....Po wykryciu wstecznego strumienia żądań do przodu, oczekiwane linie pamięci podręcznej są wstępnie wybierane. Wcześniejsza pamięć podręczna linie muszą znajdować się na tej samej stronie 4K.

  • Program streamer może wysyłać dwa żądania pobierania wstępnego dla każdego wyszukiwania L2. Streamer może pracować do 20 linii przed żądaniem ładowania.
  • Dostosowuje się dynamicznie do liczby oczekujących żądań na rdzeń. Jeśli nie ma zbyt wielu oczekujących żądań, streamer przesuwa się dalej. Jeśli istnieje wiele wybitnych żądań , jest pobierana wstępnie do LLC i mniej daleko.
  • Gdy linie pamięci podręcznej są daleko przed sobą, to przeskakuje tylko do ostatniej pamięci podręcznej poziomu, a nie do L2. Ta metoda pozwala uniknąć wymiany użytecznych linii pamięci podręcznej w pamięci podręcznej L2.
  • Wykrywa i utrzymuje do 32 strumieni dostępu do danych. Dla każdej strony o rozmiarze 4 kilobajtów można utrzymywać jeden ruch do przodu i jeden strumień wsteczny.

To z sekcji Sandy Bridge, ale odcinki Haswell i Skylake nie pójść do dowolnego szczegółowo o zmianach prefetching. Mówią "poprawione pobieranie wstępne", ale prawdopodobnie jest to ten sam podstawowy projekt, tylko z lepszą heurystyką i/lub lepszym dopasowaniem do istniejącej heurystyki i tym podobnych.


Podziękowania dla @HansPassant: jego komentarz na temat tego pytania sprawił, że pomyślałem o tym, że prefetching nie nadąża.

Powiązane problemy