Wieloprocesorowy był pierwszą wersją: miałbyś jedną lub więcej płyt głównych z jednym lub więcej chipami procesora. Główny problem polegał na tym, że procesory musiały ujawniać część swoich danych wewnętrznych innemu procesorowi, aby nie wchodzić im w drogę.
Następnym krokiem była hiperwątkowość. Jeden układ na płycie głównej, ale niektóre elementy miały dwa razy wewnętrznie, więc mógł wykonać dwie instrukcje w tym samym czasie.
Obecny rozwój jest wielordzeniowy. To w zasadzie oryginalny pomysł (kilka kompletnych procesorów), ale w jednym chipie. Zaleta: projektanci chipów mogą łatwo umieścić dodatkowe przewody dla sygnałów synchronizacji w chipie (zamiast kierować je na pin, a następnie przez zatłoczoną płytę główną i do drugiego układu).
Dzisiejsze super komputery są wieloprocesorowe, wielordzeniowe: mają wiele płyt głównych z zwykle 2-4 procesorami, każdy procesor jest wielordzeniowy i każdy ma własną pamięć RAM.
[EDYCJA] Masz rację. Tylko kilka drobnych punktów:
Hyper-threading śledzi dwa konteksty naraz w jednym rdzeniu, eksponując więcej równoległości na niesprawny rdzeń procesora. Dzięki temu jednostki wykonawcze są zasilane pracą, nawet jeśli jeden wątek utknie w martwym punkcie pamięci podręcznej, błędnym przewidywaniu gałęzi lub oczekiwaniu na wyniki instrukcji o dużym opóźnieniu. Jest to sposób na uzyskanie większej całkowitej przepustowości bez replikowania dużej ilości sprzętu, ale jeśli już, spowalnia każdy wątek z osobna. Zobacz te pytania i odpowiedzi, aby uzyskać więcej informacji i wyjaśnić, co było nie tak w poprzednim brzmieniu tego akapitu.
Głównym problemem związanym z wieloma procesorami jest to, że działający na nich kod w końcu uzyska dostęp do pamięci RAM. Istnieje N procesorów, ale tylko jedna magistrala zapewnia dostęp do pamięci RAM. Musisz więc mieć sprzęt, który zapewni, że a) każdy procesor otrzyma odpowiednią ilość dostępu do pamięci RAM, b) który dostęp do tej samej części pamięci RAM nie powoduje problemów i c) co najważniejsze, że CPU 2 zostanie powiadomiony gdy CPU 1 zapisuje do jakiegoś adresu pamięci, który CPU 2 ma w swojej wewnętrznej pamięci podręcznej. Jeśli tak się nie stanie, procesor 2 z radością wykorzysta wartość z pamięci podręcznej, nieświadomy faktu, że jest nieaktualna
Wyobraź sobie, że masz zadania na liście i chcesz je rozłożyć na wszystkie dostępne procesory. Więc CPU 1 pobierze pierwszy element z listy i zaktualizuje wskaźniki. CPU 2 zrobi to samo. Ze względu na wydajność oba procesory nie tylko skopiują kilka bajtów do pamięci podręcznej, ale całą „linię pamięci podręcznej” (cokolwiek to może być). Założenie jest takie, że kiedy czytasz bajt X, wkrótce przeczytasz także X + 1.
Teraz oba procesory mają kopię pamięci w swojej pamięci podręcznej. CPU 1 pobierze wtedy następny element z listy. Bez synchronizacji pamięci podręcznej nie zauważyłby, że procesor 2 również zmienił listę i zacznie działać na tym samym elemencie, co procesor 2.
To właśnie sprawia, że praca wieloprocesorowa jest tak skomplikowana. Skutki uboczne mogą prowadzić do gorszej wydajności niż ta, którą można uzyskać, gdyby cały kod działał tylko na jednym procesorze. Rozwiązanie było wielordzeniowe: możesz łatwo dodać tyle przewodów, ile potrzebujesz, aby zsynchronizować pamięci podręczne; można nawet skopiować dane z jednej pamięci podręcznej do drugiej (aktualizowanie części linii pamięci podręcznej bez konieczności jej opróżniania i ponownego ładowania) itp. Lub logika pamięci podręcznej mogłaby zapewnić, że wszystkie procesory otrzymają tę samą linię pamięci podręcznej, gdy uzyskują dostęp do tej samej części prawdziwa pamięć RAM, po prostu blokująca CPU 2 na kilka nanosekund, aż CPU 1 wprowadzi swoje zmiany.
[EDIT2] Głównym powodem, dla którego wielordzeniowy jest prostszy niż wieloprocesorowy, jest to, że na płycie głównej po prostu nie można poprowadzić wszystkich przewodów między dwoma chipami, które byłyby potrzebne, aby synchronizacja była skuteczna. Dodatkowo sygnał przemieszcza się tylko 30 cm / ns wierzchołków (prędkość światła; w przewodzie zwykle masz znacznie mniej). I nie zapominaj, że na wielowarstwowej płycie głównej sygnały zaczynają na siebie wpływać (przesłuchy). Lubimy myśleć, że 0 to 0 V, a 1 to 5 V, ale w rzeczywistości „0” to coś między -0,5 V (przesterowanie przy zrzucaniu linii z 1 -> 0) a .5 V i „1” to wartość powyżej 0,8 V.
Jeśli masz wszystko w jednym chipie, sygnały działają znacznie szybciej i możesz mieć ich tyle, ile chcesz (no prawie :). Ponadto znacznie łatwiej jest kontrolować przesłuchy sygnału.