Procesory

Ograniczenia architektury jednordzeniowej

hardcore it logoJeśli chodzi o stopień równoległego wykonywania instrukcji, współczesna architektura procesorów jednordzeniowych osiągnęła już górny pułap swoich możliwości. Współczynnik IPC (Instructions Per Cycle), czyli liczba instrukcji wykonywanych przez procesor w jednym cyklu zegara, wynosi mniej więcej od 3 do 4 (np. dla Intel Core 2 jest to ok. 3,5, dla rdzenia Sandy Bridge (Core i3, i5 i i7) ok. 4,1, a dla architektury AMD Bulldozer ok. 4,0).

Dalsze zwiększanie liczny jednocześnie wykonywanych instrukcji powodowałoby już znaczne skomplikowanie architektury układu, a co za tym idzie - pojawienie się problemów z jego zaprojektowaniem, zwiększeniem zajmowanej przez układ powierzchni, odprowadzaniem ciepła czy komunikacją między poszczególnymi modułami, które w rezultacie mogłyby już doprowadzić do spowolnienia działania procesora jako całości.

potok superskalarny
Prosty potok superskalarny, w którym jednocześnie pobierane i wysyłane są dwie instrukcje. W jednym cyklu zegara mogą tu zostać maksymalnie wykonane dwie instrukcje.

Podobnie sprawy mają się z przyspieszaniem zegara procesora. Tutaj napotkano na trudną do ominięcia barierę przy częstotliwości zegara wynoszącej ok. 5 GHz. Okazało się, że przy tak wysokich częstotliwościach pracy układu trudno już jednoznacznie określić, co jest jeszcze użytecznym sygnałem, a co już szumem spowodowanym wysoką temperaturą  panującą wewnątrz układu. Wprawdzie można podkręcić procesor do tak wysokich częstotliwości (obecny rekord to 8,2 GHz), niemniej procesor wymaga wówczas specjalnego układu chłodzenia – np. overclockerzy bijący rekordy używają do podkręcania ciekłego azotu. Między innymi dlatego na rynku nie sprzedaje się układów o tak wyśrubowanych parametrach, a seryjnie produkowane najszybsze układy pracują z częstotliwością ok. 3,6–3,7 GHz (np. AMD Phenom II X4 980 Black Edition – 3,7 GHz, czy Intel Core i7 3820 pracujący standardowo z częstotliwością 3,6 GHz, a w trybie Turbo 3,9 GHz).

chłodzenie ciekłym azotem
Zmuszenie procesora do pracy z szybkością 6–8 GHz wymaga już zastosowania ekstremalnych metod chłodzenia np. za pomocą ciekłego azotu

Układy wielordzeniowe

Czy da się zatem zwiększyć jeszcze szybkość pracy procesorów? Na szczęście tak.  Aby ominąć wspomniane przed chwilą ograniczenia, konstruktorzy procesorów sięgnęli po sprawdzoną w superkomputerach oraz wysokowydajnych serwerach i stacjach roboczych metodę, a mianowicie wieloprocesorowość. W klasycznych wieloprocesorowych serwerach wykorzystuje się tzw. architekturę SMP (Symmetric MultiProcessing), która pozwala na symetryczne przetwarzanie danych jednocześnie na kilku procesorach. Procesory te współdzielą ze sobą zasoby pamięci (pamięć operacyjną RAM i pamięć masową – np. dyski twarde) oraz interfejsy I/O. Co ważne, procesory w architekturze SMP komunikują się ze sobą za pomocą wspólnej magistrali systemowej, a przydział procesorów dla poszczególnych zadań (wątków, ang. thread) realizowany jest przez system operacyjny. Oznacza to, że system musi być przystosowany do dzielenia zadań na fragmenty i rozdzieleniem ich na wiele procesorów. Zaletą architektury SMP jest jej prosta sprzętowa implementacja i prosty model programowy.

Architektura SMP
Architektura SMP

Dzięki temu, że architektura SMP jest stosunkowo prosta w implementacji, zastosowano ją "z marszu" w konstrukcji procesorów wielordzeniowych. Produkowane obecnie układy są tak naprawdę kilkoma procesorami, zwanymi w tym wypadku rdzeniami, zamkniętymi w jednej obudowie – a ściślej wyprodukowanymi na jednej płytce krzemowej. Każdy z rdzeni procesora wielordzeniowego jest identyczny i komunikuje się z pozostałymi rdzeniami za pomocą jednej wewnętrznej magistrali systemowej. W zależności od konstrukcji, w sklepach dostępne są układy dwu-, trzy-, cztero-, sześcio-, ośmio- a nawet dwunastordzeniowe (seria układów AMD Opteron 6000).

Pozostawiono też możliwość pracy wielordzeniowych układów w konfiguracjach wieloprocesorowych – taką architekturę stosuje się głownie w serwerach. Dzięki temu serwer wyposażony w płytę główną np. z czterema złączami procesorowymi może mieć łącznie np. 32 rdzenie. W przeszłości tak rozbudowanych maszyn wieloprocesorowych bez użycia układów wielordzeniowych nie dało się po prostu budować.

Krzemowa struktura dwunastordzeniowego procesora z serii AMD Opteron 6000
Krzemowa struktura dwunastordzeniowego procesora z serii AMD Opteron 6000 (Magny Cours)

Wątki i wielowątkowość

W tym miejscu warto poświęcić kilka słów pojęciom wątku, wielowątkowości i współbieżności, które są ściśle związane z wieloprocesorowością i wielordzeniowością. Wątek to po prostu część programu komputerowego, która jest wykonywana niezależnie od innych jego części. Innymi słowy, wątki to kolejne ciągi instrukcji wykonywane oddzielnie. Jeżeli w danej chwili może być przetwarzamy tylko jeden wątek, wówczas mamy do czynienia z programem jednowątkowym. Jeżeli kilka wątków programu może być wykonywanych przez procesor niezależnie od siebie w tym samym czasie, wówczas mamy do czynienia ze współbieżnym przetwarzaniem wątków i programem wielowątkowym. Przetwarzanie współbieżne realizowane jest na procesorze jednordzeniowym w taki sposób, że uruchomione na tym samym rdzeniu wątki przełączane są w krótkich odstępach czasu. Dzięki temu mamy wrażenie, że wykonują się one równolegle. 

Symultaniczna wielordzeniowość
Symultaniczna wielordzeniowość

Wielowątkowość (ang. multithreading) to z kolei możliwość fizycznego, jednoczesnego wykonywania wielu wątków programu na pojedynczym rdzeniu procesora. Realizacja w jednordzeniowych procesorach wielowątkowości możliwa jest dzięki wspomnianej na początku superskalarności i dzięki temu, że nie wszystkie moduły danej jednostki wykonawczej są w danej chwili w jednakowym stopniu wykorzystywane przez dany wątek.

Nic nie stoi na przeszkodzie, aby nieaktywne elementy jednostki wykonawczej mogły w tym czasie przetwarzać inny wątek, zwiększając tym samym efektywność wykorzystania całego procesora. Wielowątkowa struktura oprogramowania ułatwia systemowi operacyjnemu rozłożenie poszczególnych zadań na kilka procesorów lub rdzeni.