Procesory

Superskalarność

przeczytasz w 4 min.

I tak doszliśmy do kolejnej metody zwiększania wydajności procesora – zwielokrotniania jednostek wykonawczych i związanej z tym możliwości wielopotokowego przetwarzania danych. Procesor, który ma zwielokrotnione jednostki wykonawcze nosi nazwę procesora superskalarnego. Jeżeli dodatkowo jest on w stanie przetwarzać dane w  kilku niezależnych potokach, to taką architekturę nazywa się architekturą hiperskalarną. Zastosowanie superskalarności w praktyce stało się możliwe w chwili gdy szerokość szyny danych procesora zaczęła być większa niż długość słowa dla pojedynczej instrukcji. W  przypadku współczesnych procesorów  zgodnych z architekturą x86 słowa mają postać 8-, 16-, 32- i 64-bitowych rozkazów. Nie jest więc problemem przesłanie w jednym takcie 128-, 256-, czy 512-bitową szyną danych kilku instrukcji.

Idea architektury superskalarnej
Idea architektury superskalarnej

Idea powielenia jednostek wykonawczych pochodzi z procesorów typu RISC (Reduced Instruction Set Computer). W świecie układów x86 pierwszą hiperskalarną konstrukcją był procesor Pentium Pro, w którym zastosowano cztery równoległe potoki wykonawcze. Potoki te realizowane były na dwóch jednostkach arytmetyczno-logicznych ALU (Arithmetic Logic Unit) i dwóch zmiennoprzecinkowych FPU (Floating Point Unit). Wszystkie kolejne układy zgodne z architekturą x86 są już konstrukcjami hiperskalarnymi.

Współczynnik IPC

Obecnie jednym z najważniejszych wyznaczników wydajności procesorów – oprócz liczby rdzeni i szybkości zegara taktującego – jest współczynnik IPC (Instructions Per Cycle), który określa liczbę instrukcji wykonanych w czasie jednego cyklu zegara taktującego. Dzięki architekturze superskalarnej i przedstawionym przed chwilą metodom zwiększania wydajności procesora bez przyspieszania częstotliwości zegara, konstruktorom udało się osiągnąć wartość współczynnika IPC na poziomie 3-4 instrukcji wykonywanych w jednym cyklu zegara taktującego. Na przykład dla procesorów Intel Core 2 IPC wynosi ok. 3,5 licząc na jeden rdzeń procesora, dla najnowszego jądra Intela Sandy Bridge jest to 4,1, a dla architektury AMD Bulldozer IPC wynosi zaś około 4,0.

Niestety, zwiększanie liczby jednocześnie wykonywanych instrukcji nie jest łatwe. Wymaga bowiem dalszego zwielokrotniania modułów  wykonawczych, co spowodowałoby już znaczne skomplikowanie architektury układu, a co za tym idzie - również pojawienia się problemów nie tylko z  samym z zaprojektowaniem procesora, ale również kłopotów  wynikających ze zwiększenia zajmowanej przez układ powierzchni, komunikacją między poszczególnymi modułami oraz odprowadzaniem ciepła. W wyniku tego, zamiast przyspieszyć układ, jako całość mogłyby w znaczący sposób spowolnić swoje działanie.

Wielowątkowość i symultaniczna wielowątkowość

Pojęciem związanym bezpośrednio z superskalarnością i w pewien sposób pośrednio ze współczynnikiem IPC jest wielowątkowość. Na początku odpowiedzmy sobie na pytanie co to jest wątek (ang. thread). Otóż watek to część programu komputerowego, która jest wykonywana niezależnie od innych części tego programu. Jeżeli w danym momencie może być przetwarzamy tylko jeden wątek, wówczas mamy do czynienia z  programem jednowątkowym, jeżeli zaś w tym samym czasie może być przetwarzanych kilka wątków tego programu, niezależnie od siebie, wówczas mamy do czynienia z tzw. współbieżnym przetwarzaniem wątków, a  taki program nazywa się wielowątkowym.

W praktyce przetwarzanie współbieżne realizowane jest na jednordzeniowym procesorze w taki sposób, że uruchomione na tym samym rdzeniu wątki przełączane są w  bardzo krótkich odstępach czasu, a użytkownik ma wrażenie, że wykonują się one równolegle. W ten sam sposób realizuje się też działanie kilku lub kilkunastu różnych programów naraz na jednym rdzeniu procesora, a  także jednoczesne działanie różnych procesów  związanych z systemem operacyjnym i uruchomionymi na nim aplikacjami. Istotne jest tu to, że taka wielowątkowość realizowana jest na poziomie systemu operacyjnego i  nie ma związku z fizyczną budową procesora.

Jednak współczesne procesory dzięki swojej superskalarnej budowie nie muszą co chwilę przełączać się między wątkami, a to dlatego, że nie wszystkie moduły danej jednostki wykonawczej są w danej chwili w  jednakowym stopniu wykorzystywane przez dany wątek i nic nie stoi na przeszkodzie, aby nieaktywne elementy jednostki wykonawczej mogły w tym czasie przetwarzać inny wątek należący do tego samego lub innego programu. Cecha związana z możliwością fizycznego, jednoczesnego wykonywania wielu wątków programu na pojedynczym rdzeniu procesora nazywa się wielowątkowością (ang. multithreading) i może być realizowana na kilka sposobów.

Najprostszą z nich jest tzw. wielowątkowość zgrubna – ang. coarse multithreading. Tutaj przełączenie obsługi na następny wątek następuje w  sposób sprzętowy w chwili, gdy dotychczas realizowany wątek wyczerpał swój zapas danych lub skończył się kod zgromadzony w  pamięci cache lub buforze ROB. Znacznie bardziej zaawansowaną techniką pozwalającą wykorzystać superskalarną mikroarchchitekturę procesora do pracy wielowątkowej jest symultaniczna wielowątkowość (ang. SMT – Simultaneous Multithreading), znana też pod nazwą wielowątkowości współbieżnej. Technika ta znana jest już pod nazwą technologii Hyper-Threading od czasów procesorów Pentium 4.

Działanie technologii HyperThreading
Działanie technologii Hyper-Threading

W wypadku technologii symultanicznej wielowątkowości do mikroarchitektury procesora wprowadza się fizycznie dodatkowe moduły, w  których to powiela się jedynie fragmenty struktury procesora odpowiedzialne wyłącznie za przechowywanie stanów poszczególnych jednostek wykonawczych procesora (w tym zawartości rejestrów) – istotne jest to, że nie duplikuje się tutaj całych modułów wykonawczych – oraz element zarządzający technologią SMT. Ten ostatni odpowiada za elastyczne przełączanie poszczególnych jednostek wykonawczych (w  zależności od ich obciążenia) w trakcie działania procesora między aktualnym ich stanem, a stanem zapisanym w modułach „pseudowykonawczych”. Dzięki temu jednostki wykonawcze procesora mogą wykonywać w dynamiczny sposób raz jeden, raz drugi wątek programu, tak jakby realizowany był on fizycznie na dwóch lub kilku procesorach – w  wypadku technologii Hyper-Threading Intela dla każdego rdzenia tworzony jest drugi wirtualny procesor, który widziany jest przez system operacyjny jako drugi odrębny procesor fizyczny. Co ważne, technologia SMT jest całkowicie przezroczysta dla systemu operacyjnego i  uruchomionych na nim programów. Aby z niej skorzystać wystarczy jedynie to, aby system operacyjny wspierał obsługę maszyn wieloprocesorowych.