 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.
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 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 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.



