Odpowiedź @ peufeu wskazuje, że są to ogólnosystemowe łączne przepustowości. L1 i L2 to prywatne pamięci podręczne na rdzeń w rodzinie Intel Sandybridge, więc liczby są dwa razy większe niż jeden rdzeń. Ale to wciąż pozostawia nam imponująco wysoką przepustowość i niskie opóźnienia.
Pamięć podręczna L1D jest wbudowana bezpośrednio w rdzeń procesora i jest bardzo ściśle sprzężona z jednostkami wykonującymi obciążenie (i buforem pamięci) . Podobnie pamięć podręczna L1I znajduje się tuż obok części pobierania / dekodowania instrukcji rdzenia. (Właściwie nie spojrzałem na krzemowy plan podłogi Sandybridge, więc może to nie być dosłownie prawda. Część wydania / zmiany nazwy w interfejsie jest prawdopodobnie bliższa zdekodowanej pamięci podręcznej UOP, która oszczędza energię i ma lepszą przepustowość niż dekodery).
Ale z pamięcią podręczną L1, nawet jeśli moglibyśmy czytać w każdym cyklu ...
Po co się tu zatrzymywać? Intel od Sandybridge i AMD, ponieważ K8 może wykonywać 2 obciążenia na cykl. Wieloportowe pamięci podręczne i TLB to coś.
Zapis mikroarchitektury Davida Kantera w Sandybridge ma ładny schemat (który dotyczy również twojego procesora IvyBridge):
(„Ujednolicony program planujący” wstrzymuje operacje ALU i zmiany pamięci czekające na gotowe dane wejściowe i / lub oczekiwanie na ich port wykonawczy. (Np. vmovdqa ymm0, [rdi]
Dekoduje do zmiany obciążenia, która musi poczekać, rdi
jeśli poprzednie add rdi,32
jeszcze nie zostało wykonane, dla przykład). Intel planuje zrzuty do portów w momencie wydania / zmiany nazwy . Ten diagram pokazuje tylko porty wykonania dla zrzutu pamięci, ale również niewykonane kopie ALU również o to konkurują. Stopień wydania / zmiany nazwy dodaje zrzuty do ROB i harmonogramu Pozostają w ROB do wycofania, ale w harmonogramie tylko do wysyłki do portu wykonawczego (to terminologia Intela; inne osoby używają wystawiania i wysyłania inaczej). AMD stosuje osobne harmonogramy dla liczb całkowitych / FP, ale tryby adresowania zawsze używają rejestrów liczb całkowitych
Jak to pokazuje, istnieją tylko 2 porty AGU (jednostki generujące adresy, które przyjmują tryb adresowania jak [rdi + rdx*4 + 1024]
i wytwarzają adres liniowy). Może wykonywać 2 operacje pamięci na zegar (po 128b / 16 bajtów każdy), przy czym jeden z nich jest sklepem.
Ale ma swoją sztuczkę: SnB / IvB uruchamia 256b AVX ładuje / przechowuje jako pojedynczy pakiet, który zajmuje 2 cykle w porcie ładowania / przechowywania, ale potrzebuje tylko AGU w pierwszym cyklu. Pozwala to na uruchomienie UOP adresu sklepu na AGU na porcie 2/3 podczas tego drugiego cyklu bez utraty przepustowości obciążenia. Dzięki AVX (który nie obsługuje procesorów Intel Pentium / Celeron: /), SnB / IvB może (teoretycznie) wytrzymać 2 obciążenia i 1 sklep na cykl.
Twój procesor IvyBridge jest znacznie mniejszy od Sandybridge (z pewnymi ulepszeniami mikroarchitekturalnymi, takimi jak eliminacja mov , ERMSB (memcpy / memset) i wstępne pobieranie sprzętu na następnej stronie). Generacja po tym (Haswell) podwoiła przepustowość L1D na zegar, rozszerzając ścieżki danych z jednostek wykonawczych do L1 z 128b do 256b, aby obciążenia AVX 256b mogły utrzymać 2 na zegar. Dodano także dodatkowy port AGU sklepu dla prostych trybów adresowania.
Szczytowa przepustowość Haswell / Skylake wynosi 96 bajtów + zapisanych na zegar, ale podręcznik optymalizacji Intela sugeruje, że średnia średnia wydajność Skylake (przy założeniu braku błędów L1D lub TLB) wynosi ~ 81B na cykl. (Skalarna pętla liczb całkowitych może wytrzymać 2 obciążenia + 1 pamięć na zegar zgodnie z moimi testami na SKL, wykonując 7 (unused-domain) uops na zegar z 4 uops w domenie fused. Ale zwalnia nieco z 64-bitowymi operandami zamiast 32-bit, więc najwyraźniej istnieje pewien limit zasobów mikroarchitektonicznych i nie jest to tylko kwestia planowania zmian adresu sklepu do portu 2/3 i kradzieży cykli z obciążeń).
Jak obliczyć przepustowość pamięci podręcznej na podstawie jej parametrów?
Nie możesz, chyba że parametry obejmują praktyczne liczby przepustowości. Jak wspomniano powyżej, nawet L1D Skylake nie nadąża za jednostkami wykonawczymi ładowania / przechowywania dla wektorów 256b. Chociaż jest blisko i może mieć 32-bitowe liczby całkowite. (Nie ma sensu mieć więcej jednostek ładujących niż pamięć podręczna miała porty do odczytu lub odwrotnie. Po prostu pomijałby sprzęt, którego nigdy nie można w pełni wykorzystać. Zauważ, że L1D może mieć dodatkowe porty do wysyłania / odbierania linii do / z innych rdzeni, a także do odczytu / zapisu z wnętrza rdzenia.)
Samo spojrzenie na szerokości i zegary magistrali danych nie daje ci całej historii.
Przepustowość L2 i L3 (i pamięci) może być ograniczona liczbą zaległych braków, które L1 lub L2 mogą śledzić . Przepustowość nie może przekroczyć opóźnienia * max_concurrency, a układy z wyższym opóźnieniem L3 (podobnie jak wielordzeniowy Xeon) mają znacznie mniejszą przepustowość jednordzeniowego L3 niż dwurdzeniowy / czterordzeniowy procesor tej samej mikroarchitektury. Zobacz sekcję „Platformy związane z opóźnieniami” w tej odpowiedzi SO . Procesory z rodziny Sandybridge mają 10 buforów wypełniania linii do śledzenia braków L1D (używanych również w sklepach NT).
(Łączna przepustowość L3 / pamięci z wieloma aktywnymi rdzeniami jest ogromna na dużym Xeonie, ale jednowątkowy kod widzi gorsze pasmo niż na czterordzeniowym rdzeniu przy tej samej szybkości zegara, ponieważ więcej rdzeni oznacza więcej przystanków na szynie pierścieniowej, a zatem wyższe opóźnienie L3.)
Opóźnienie pamięci podręcznej
W jaki sposób osiąga się taką prędkość?
Opóźnienie 4-cyklowego ładowania pamięci podręcznej L1D jest dość niesamowite , szczególnie biorąc pod uwagę, że musi zacząć się od trybu adresowania takiego jak [rsi + 32]
, więc musi dodać, zanim będzie miał adres wirtualny . Następnie musi to przełożyć na język fizyczny, aby sprawdzić dopasowanie tagów pamięci podręcznej.
(Tryby adresowania inne niż [base + 0-2047]
dodatkowy cykl w rodzinie Intel Sandybridge, więc w AGU znajduje się skrót do prostych trybów adresowania (typowe dla przypadków ścigania wskaźnika, gdzie prawdopodobnie małe opóźnienie użycia obciążenia jest najważniejsze, ale także ogólnie) (Zobacz Podręcznik optymalizacji Intela , sekcja Sandybridge 2.3.5.2 L1 DCache.) Zakłada to również brak zastąpienia segmentu i adres podstawowy segmentu 0
, co jest normalne.)
Musi także sondować bufor sklepu, aby sprawdzić, czy pokrywa się on z wcześniejszymi sklepami. I musi to rozgryźć, nawet jeśli wcześniejszy (w kolejności programowej) adres sklepu nie został jeszcze wykonany, więc adres sklepu nie jest znany. Ale przypuszczalnie może się to zdarzyć równolegle ze sprawdzeniem trafienia L1D. Jeśli okaże się, że dane L1D nie były potrzebne, ponieważ przekazywanie do sklepu może dostarczyć dane z bufora sklepu, to nie jest to strata.
Intel używa pamięci podręcznej VIPT (wirtualnie indeksowane fizycznie oznaczone) jak prawie wszyscy inni, stosując standardową sztuczkę polegającą na tym, że pamięć podręczna jest wystarczająco mała i ma wystarczająco duże skojarzenie, aby zachowywała się jak pamięć podręczna PIPT (bez aliasingu) z prędkością VIPT (może indeksować w równolegle z wirtualnym> fizycznym wyszukiwaniem TLB).
Pamięci podręczne L1 Intela są 32kB, 8-kierunkowe asocjacyjne. Rozmiar strony to 4kiB. Oznacza to, że bity „indeksu” (które wybierają zestaw 8 sposobów buforowania dowolnej linii) znajdują się poniżej przesunięcia strony; tzn. te bity adresu są przesunięciem na stronę i zawsze są takie same w adresie wirtualnym i fizycznym.
Aby uzyskać więcej informacji na temat tego i innych szczegółów, dlaczego małe / szybkie pamięci podręczne są przydatne / możliwe (i działają dobrze, gdy są sparowane z większymi wolniejszymi pamięciami podręcznymi), zobacz moją odpowiedź, dlaczego L1D jest mniejszy / szybszy niż L2 .
Małe pamięci podręczne mogą robić rzeczy, które byłyby zbyt drogie w przypadku większych pamięci podręcznych, takie jak pobieranie tablic danych z zestawu w tym samym czasie, co pobieranie tagów. Kiedy więc komparator znajdzie odpowiedni pasujący tag, musi po prostu zmiksować jedną z ośmiu 64-bajtowych linii pamięci podręcznej, które zostały już pobrane z SRAM.
(To nie jest tak proste: Sandybridge / Ivybridge używają buforowanej pamięci podręcznej L1D z ośmioma bankami po 16 bajtów. Możesz uzyskać konflikty między pamięcią podręczną, jeśli dwa wejścia do tego samego banku w różnych liniach pamięci podręcznej spróbują wykonać w tym samym cyklu. (Istnieje 8 banków, więc może się tak zdarzyć w przypadku adresów o wielokrotności 128, tj. 2 linii pamięci podręcznej).
IvyBridge nie ma również kary za niezaangażowany dostęp, o ile nie przekroczy granicy linii pamięci podręcznej 64B. Wydaje mi się, że określa, które banki należy pobrać na podstawie niskich bitów adresu i konfiguruje wszelkie zmiany, jakie będą musiały się zdarzyć, aby uzyskać prawidłowe 1 do 16 bajtów danych.
W przypadku podziału linii pamięci podręcznej nadal jest to tylko jedna poprawka, ale umożliwia dostęp do wielu pamięci podręcznej. Kara jest wciąż niewielka, z wyjątkiem podziału na 4k. Skylake sprawia, że nawet 4k podziały są dość tanie, z opóźnieniem około 11 cykli, tak samo jak normalny podział linii pamięci podręcznej ze złożonym trybem adresowania. Ale przepustowość przy podziale na 4k jest znacznie gorsza niż przy podziale na cl bez podziału.
Źródła :