Dobre pytanie lub przynajmniej jedno z ciekawą odpowiedzią. Część tej odpowiedzi przedstawia świat, w którym procesory mogłyby efektywnie skalować się na szerokość zamiast z wieloma oddzielnymi rdzeniami. Modele licencjonowania / ceny byłyby inne!
Reszta wyjaśnia, dlaczego nie mogą. Podsumowanie:
- Koszt wielu rdzeni jest zbliżony do liniowego
- Koszt rozszerzenia superskalarnego rurociągu 1 rdzenia skaluje się ~ kwadratowo Jest to wykonalne przy użyciu wystarczającej siły brutalnej, do pewnego stopnia. Wydajność jednowątkowa jest bardzo ważna dla zastosowań interaktywnych (opóźnienie od końca do końca ma znaczenie, nie tylko przepustowość), więc obecne wysokowydajne procesory klasy wyższej płacą tę cenę. np. Skylake (4-szeroki), Ryzen (5 lub 6-szeroki) i Apple A12 (7-szeroki dla dużych rdzeni, 3-szeroki dla małych energooszczędnych rdzeni)
- Poważne zmniejszanie się zwrotów IPC z samego poszerzenia potoku poza 3 lub 4 szerokości, nawet przy wykonywaniu poza kolejnością w celu znalezienia ILP . Nieudane rozgałęzienia i bufory pamięci podręcznej są trudne i wciąż blokują cały rurociąg.
Nie wspominałeś o częstotliwości, tylko IPC, ale częstotliwość skalowania jest również trudna. Wyższa częstotliwość wymaga wyższego napięcia, więc skala mocy z częstotliwością sześcianową : ^1
od częstotliwości bezpośrednio i ^2
od napięcia. (Skala energii zmagazynowanej w kondensatorze z V ^ 2, a większość mocy dynamicznej poza prądem upływowym pochodzi z pompowania ładunku do obciążeń pojemnościowych bramek i przewodów FET).
Wydajność = częstotliwość razy IPC. (W ramach tej samej architektury. Szerszy SIMD pozwala wykonać tę samą pracę przy mniejszej liczbie instrukcji, a niektóre ISA są gęstsze niż inne, np. MIPS często wykonuje więcej instrukcji, aby wykonać tę samą pracę niż x86 lub AArch64.)
Koszty dotyczą obszaru matrycy (koszt produkcji) i / lub mocy (co pośrednio ogranicza częstotliwość, ponieważ chłodzenie jest trudne). Również niższa moc i wydajność na wat jest celem samym w sobie, szczególnie w przypadku urządzeń mobilnych (akumulator) i serwerów (gęstość energii / koszty chłodzenia / koszty energii elektrycznej).
Zanim wielordzeniowy procesor na gniazdo był czymś, istniały systemy z wieloma gniazdami do zastosowań wysokiej klasy, w których potrzebna była większa przepustowość niż możliwa do uzyskania z pojedynczym procesorem, który można wyprodukować, więc były to jedyne systemy SMP. (Serwery, stacje robocze wysokiej klasy).
Gdyby pojedynczy rdzeń mógł skalować się tak skutecznie, jak sobie tego życzysz, mielibyśmy systemy z 1 rdzeniem fizycznym na gniazdo i SMT (np. HyperThreading), aby mogły działać jak wiele rdzeni logicznych. Typowe komputery stacjonarne / laptopy miałyby tylko 1 rdzeń fizyczny, i nie mielibyśmy trudności z równoległością rzeczy, które nie skalują się liniowo z większą liczbą rdzeni. np. make -j4
aby skorzystać z serwerów z wieloma gniazdami i / lub ukryć opóźnienia we / wy na pulpicie. (A może nadal próbowalibyśmy dużo zrównoleglać, gdyby szerokość rurociągu była skalowana łatwo, ale IPC nie, więc musieliśmy użyć większej liczby wątków SMT). Jądro systemu operacyjnego nadal musiałoby działać na wszystkich rdzeniach logicznych, chyba że w sposób przedstawia, że SMT dla systemu operacyjnego było bardzo różne, więc algorytmy szeregowania równoległego i blokowania byłyby nadal potrzebne.
Donald Knuth powiedział w wywiadzie z 2008 roku
Równie dobrze mogę powiedzieć o moim osobistym niezadowoleniu z obecnego trendu w kierunku architektury wielordzeniowej. Dla mnie wygląda to mniej więcej tak, jakby projektantom sprzętu zabrakło pomysłów i że próbują zrzucić winę za przyszłą śmierć Prawa Moore'a na twórców oprogramowania, dając nam maszyny, które działają szybciej tylko na kilku kluczowe punkty odniesienia!
Tak, gdybyśmy mogli mieć cudowne jednordzeniowe procesory z 8-krotnie większą przepustowością w prawdziwych programach , prawdopodobnie nadal byśmy ich używali. W przypadku systemów z dwoma gniazdami tylko wtedy, gdy warto było zapłacić znacznie więcej za większą przepustowość (a nie wydajność jednowątkowa).
Wiele procesorów zmniejsza koszty przełączania kontekstu, gdy uruchomionych jest wiele programów (umożliwiając ich rzeczywiste działanie równoległe zamiast szybkiego przełączania między nimi); zapobiegawcza wielozadaniowość, przerywająca ogromną maszynę zepsutą, jakiej wymagałby procesor, prawdopodobnie bolałaby jeszcze bardziej niż teraz.
Fizycznie byłby to pojedynczy rdzeń (dla prostej hierarchii pamięci podręcznej bez połączeń między rdzeniami), ale obsługuje SMT (np. Intel HyperThreading), więc oprogramowanie może używać go jako 8 rdzeni logicznych, które dynamicznie konkurują o zasoby przepustowości. Lub gdy tylko 1 wątek jest uruchomiony / nie utknął, uzyska pełną korzyść.
Używałbyś więc wielu wątków, gdy było to w rzeczywistości łatwiejsze / naturalne (np. Oddzielne procesy działające jednocześnie) lub w przypadku problemów z równoległymi łańcuchami zależności, które uniemożliwiałyby maksymalne zwiększenie IPC tej bestii.
Niestety, Knuth uważa, że procesory wielordzeniowe przestaną być w tym momencie rzeczą.
Skalowanie wydajności w jednym wątku
Myślę, że gdyby stworzyli 1-rdzeniowy odpowiednik 8-rdzeniowego procesora, ten jeden rdzeń miałby 800% wzrost IPC, dzięki czemu uzyskasz pełną wydajność we wszystkich programach, nie tylko tych zoptymalizowanych dla wielu rdzeni.
Tak to prawda. Gdyby w ogóle możliwe było zbudowanie takiego procesora , byłoby to bardzo niesamowite. Myślę jednak, że jest to dosłownie niemożliwe w tym samym procesie produkcji półprzewodników (tj. Takiej samej jakości / wydajności tranzystorów). Z pewnością nie jest to możliwe przy takim samym budżecie mocy i obszarze matrycy, jak w przypadku 8-rdzeniowego procesora, nawet gdybyś zaoszczędził na logice, aby skleić ze sobą rdzenie i nie potrzebowałby tyle miejsca na prywatne pamięci podręczne na rdzeń.
Nawet jeśli zezwolisz na zwiększenie częstotliwości (ponieważ prawdziwym kryterium jest praca na sekundę, a nie praca na zegar), nawet 2x szybszy procesor byłby ogromnym wyzwaniem.
Gdyby możliwe było zbudowanie takiego procesora w dowolnym miejscu w pobliżu tego samego budżetu mocy i budżetu (a więc kosztów produkcji), tak, producenci procesorów już by go budowali w ten sposób.
W szczególności więcej rdzeni lub szerszych rdzeni? sekcja, aby uzyskać niezbędne informacje niezbędne do zrozumienia tej odpowiedzi; zaczyna się od tego, jak działają procesory potokowe w kolejności, a następnie superskalar (wiele instrukcji na zegar). Następnie wyjaśnia, w jaki sposób uderzyliśmy w ścianę mocy w erze P4, co doprowadziło do końca łatwego skalowania częstotliwości, pozostawiając głównie tylko IPC i wykonując więcej pracy na instrukcji (np. SIMD) jako ścieżkę do przodu, nawet przy mniejszych tranzystorach.
Zwiększenie szerokości rurociągu (maksymalna liczba instrukcji na zegar) zwykle skaluje się pod względem kosztów do kwadratu szerokości . Koszt ten jest mierzony w obszarze matrycy i / lub mocy, w celu szerszego równoległego sprawdzania zależności (wykrywanie zagrożeń) i szerszego harmonogramu poza kolejnością, aby znaleźć gotowe instrukcje do uruchomienia. I więcej portów odczytu / zapisu w pliku rejestru i pamięci podręcznej, jeśli chcesz uruchomić instrukcje inne niż nop
. Zwłaszcza jeśli masz 3-wejściowe instrukcje, takie jak FMA lub add-with-carry (2 rejestry + flagi).
Zmniejszają się również zwroty IPC z powodu poszerzenia procesorów ; większość obciążeń ma ograniczoną ILP na małą skalę / bliskiego zasięgu (równoległość na poziomie instrukcji) dla procesorów do wykorzystania, więc poszerzenie rdzenia nie zwiększa IPC (instrukcji na zegar), jeśli IPC jest już ograniczony do mniejszej niż szerokość rdzeń według łańcuchów zależności, błędów gałęzi, błędów pamięci podręcznej lub innych przeciągnięć. Na pewno uzyskasz przyspieszenie w niektórych rozwiniętych pętlach z niezależnymi iteracjami, ale nie to robi większość kodu. Instrukcje porównania / rozgałęzienia stanowią 20% miksu instrukcji w „typowym” kodzie IIRC. (Myślę, że przeczytałem liczby od 15 do 25% dla różnych zestawów danych.)
Ponadto brak pamięci podręcznej, który zatrzymuje wszystkie instrukcje zależne (a następnie wszystko po osiągnięciu pojemności ROB) kosztuje więcej dla szerszego procesora. (Koszt alternatywny pozostawienia większej liczby jednostek wykonawczych w stanie bezczynności; więcej potencjalnych prac niewykonanych.) Lub brak gałęzi podobnie powoduje bańkę.
Aby uzyskać 8-krotność IPC, potrzebowalibyśmy co najmniej 8-krotnej poprawy dokładności prognozowania gałęzi i szybkości trafień w pamięci podręcznej . Ale wskaźniki trafień w pamięci podręcznej nie skalują się dobrze, a pojemność pamięci podręcznej przekracza pewien punkt w przypadku większości obciążeń. Pobieranie wstępne sprzętu jest inteligentne, ale nie może być tak inteligentne. Przy 8-krotności IPC predyktory gałęzi muszą generować 8-krotnie więcej prognoz na cykl, a także mieć je dokładniejszymi.
Obecne techniki budowania wykonania poza kolejnością Procesory mogą wykrywać ILP tylko na krótkie odległości . Na przykład rozmiar ROB Skylake wynosi 224 uops domeny z fuzją, harmonogram dla niewykonanych uops to 97 domen z domeną fused. Zobacz Zrozumienie wpływu lfence na pętlę z dwoma długimi łańcuchami zależności, w celu zwiększenia długości w przypadku, gdy rozmiar harmonogramu jest czynnikiem ograniczającym w wydobywaniu ILP z 2 długich łańcuchów instrukcji, jeśli stają się one zbyt długie. I / lub zobacz tę bardziej ogólną i wstępną odpowiedź ).
Tak więc znalezienie ILP między dwoma oddzielnymi długimi pętlami nie jest czymś, co możemy zrobić ze sprzętem. W niektórych przypadkach może być możliwa dynamiczna rekompilacja binarna dla fuzji pętli, ale procesory trudne i nic nie mogą tak naprawdę zrobić, chyba że pójdą drogą Transmeta Crusoe. (warstwa emulacji x86 na wierzchu innego wewnętrznego ISA; w tym przypadku VLIW). Ale standardowe nowoczesne konstrukcje x86 z buforami UOP i potężnymi dekoderami nie są łatwe do pobicia dla większości kodów.
Poza wersją x86 wszystkie nadal używane ISA są stosunkowo łatwe do odkodowania, więc nie ma motywacji do dynamicznej rekompilacji innej niż optymalizacje na duże odległości. TL: DR: nadzieje na magiczne kompilatory, które mogą wystawiać więcej ILP na sprzęt, nie zadziałały dla Itanium IA-64 i jest mało prawdopodobne, aby działała na super-szeroki procesor dla jakiegokolwiek istniejącego ISA z seryjnym modelem wykonania.
Jeśli miałeś super szeroki procesor, zdecydowanie chciałbyś, aby wspierał SMT, abyś mógł go zasilać pracą, uruchamiając wiele wątków o niskiej ILP.
Ponieważ Skylake ma obecnie szerokość 4 jednostek (i osiąga rzeczywisty IPC od 2 do 3 jednostek na zegar, lub nawet bliżej liczby 4 w kodzie o wysokiej przepustowości), hipotetyczny 8-krotnie szerszy procesor miałby 32 jednostki!
Będąc w stanie wyrzeźbić to z powrotem na 8 lub 16 logicznych procesorów Fantastyczna byłaby dynamicznie współużytkują te zasoby wykonawcze: niestabilne wątki uzyskują całą przepustowość frontonu i przepustowość zaplecza.
Ale z 8 oddzielnymi rdzeniami, gdy nić utknie w martwym punkcie, nie ma nic innego, co utrzymywałoby jednostki wykonawcze w gotowości; inne wątki nie przynoszą korzyści.
Wykonanie jest często szybkie: zatrzymuje się w oczekiwaniu na ładowanie brakujące w pamięci podręcznej, a gdy nadejdzie wiele równoległych instrukcji, może skorzystać z tego wyniku. Dzięki superszerokiemu procesorowi ta seria może przyspieszyć i może pomóc w SMT.
Ale nie możemy mieć magicznych super szerokich procesorów
Aby uzyskać przepustowość, musimy zamiast tego ujawnić równoległość sprzętu w postaci równoległości na poziomie wątku . Generalnie kompilatory nie są świetne w wiedzy, kiedy / jak używać wątków, poza prostymi przypadkami, takimi jak bardzo duże pętle. (OpenMP lub gcc's -ftree-parallelize-loops
). Nadal potrzeba ludzkiej sprytności, aby przerobić kod, aby skutecznie wykonywać użyteczne prace równolegle, ponieważ komunikacja między wątkami jest droga, podobnie jak uruchamianie wątków.
TLP jest równoległobokiem gruboziarnistym, w przeciwieństwie do drobnoziarnistego ILP w ramach jednego wątku wykonania, który HW może wykorzystać.
Procesory ukierunkowane na interaktywne obciążenia (takie jak Intel / AMD x86 i rdzenie Apple / ARM AArch64 high-end) zdecydowanie wpływają na malejące zwroty skalowania IPC, ponieważ wydajność jednowątkowa jest nadal bardzo cenna gdy opóźnienie, a nie tylko przepustowość masowo równoległe problemy.
Możliwość równoległego uruchamiania 8 kopii gry przy 15 klatkach na sekundę jest o wiele mniej cenna niż możliwość uruchamiania jednej kopii przy 45 klatkach na sekundę. Dostawcy procesorów wiedzą o tym i dlatego współczesne procesory używają wykonywania poza kolejnością, mimo że kosztuje to znaczną moc i obszar umierający. (Ale procesory graficzne nie, ponieważ ich obciążenie jest już masowo równoległe).
Wielordzeniowy sprzęt Intel Xeon Phi (Knight's Landing / Knight's Mill) jest interesującym punktem zwrotnym: bardzo ograniczona realizacja zamówień poza kolejnością i SMT do utrzymywania 2-szerokich rdzeni zasilanych instrukcjami SIMX AVX512 w celu zmniejszenia liczby. Rdzenie oparte są na architekturze Silvermont o niskiej mocy Intela. (Wykonanie poza zamówieniem, ale z małym oknem zmiany kolejności, znacznie mniejszym niż rodzina rdzeni Sandybridge z dużym rdzeniem. I węższy rurociąg.)
BTW, wszystko to jest prostopadłe do SIMD. Wykonanie większej ilości pracy zgodnie z instrukcją zawsze pomaga, jeśli jest to możliwe dla twojego problemu.
Modele cenowe
Modele wyceny oprogramowania są oparte na obecnym krajobrazie sprzętu.
Modele licencjonowania na rdzeń stały się bardziej rozpowszechnione (i dotyczyły nawet komputerów stacjonarnych z jednym gniazdem) wraz z pojawieniem się procesorów wielordzeniowych. Wcześniej dotyczyło to tylko serwerów i dużych stacji roboczych.
Gdyby oprogramowanie nie potrzebowało wielu rdzeni do działania z najwyższą prędkością, tak naprawdę nie byłoby sposobu, aby sprzedawać go taniej osobom, które nie czerpią z tego tak dużych korzyści, ponieważ pracują na słabszym procesorze. Chyba że ekosystem oprogramowania / sprzętu ewoluował w „kanałach SMT”, które pozwalają skonfigurować maksymalną szerokość wykonywania dla kodu działającego na tym logicznym rdzeniu. (Znów wyobrażam sobie świat, w którym procesory skalują się pod względem szerokości potoku zamiast wielu oddzielnych rdzeni).