Superskalárny dizajn CPU umožňuje formu paralelného výpočtu nazývaného paralelizmus na úrovni inštrukcií. Cieľom je, aby jadro vykonalo viac inštrukcií za rovnakú taktovaciu frekvenciu — teda zvýšiť celkový výkon bez nutnosti zvyšovať takt. To sa dosahuje spúšťaním viacerých inštrukcií súčasne (tzv. dispečing inštrukcií) na duplicitných funkčných jednotkách v jadre.

Každá funkčná jednotka predstavuje konkrétny vykonávací prostriedok v CPU, napríklad aritmeticko-logická jednotka (ALU), jednotka s pohyblivou rádovou čiarkou (FPU), bitový posunovač alebo násobička. Keď sú k dispozícii viaceré takéhoto jednotky, procesor môže súčasne vykonávať nezávislé inštrukcie.

Väčšina superskalárnych procesorov je tiež pipelínová, hoci teoreticky je možné mať nepipelínový superskalárny procesor alebo pipelínový nesuperskalárny procesor. Pipelínovanie rozdeľuje vykonanie inštrukcie na viacero fáz (napr. fetch, decode, execute, memory, writeback), čo zvyšuje hustotu spracovania inštrukcií v čase.

Aby superskalárna technika fungovala

Superskalárnu techniku umožňuje kombinácia viacerých hardvérových funkcií jadra CPU:

  1. Pokyny pochádzajú z usporiadaného zoznamu pokynov a sú načítavané vo vstupe do jadra.
  2. Hardvér procesora dokáže zistiť, ktoré inštrukcie majú aké dátové závislosti (adresné, dátové alebo kontrolné závislosti) a ktoré sú nezávislé a teda spustiteľné paralelne.
  3. Procesor dokáže čítať a dekódovať viac inštrukcií za jeden hodinový cyklus — rozlišujeme šírku vydávania (issue width) a počet naraz spracovávaných inštrukcií.

Superskalárnosť vs. skalárne a vektorové procesory

Každá inštrukcia vykonaná skalárnym procesorom spracúva jednu alebo pár dátových položiek naraz, zatiaľ čo vektorový (SIMD) procesor spracúva jednu inštrukciu nad množinou dátových prvkov. Superskalárny procesor kombinuje tieto prístupy:

  1. Každá inštrukcia spracúva jednu dátovú položku (skalárny model).
  2. Vnútri jedného jadra sú však viaceré duplicitné funkčné jednotky, takže viac inštrukcií — každá nad svojou dátovou položkou — môžu byť spracované súčasne.

Funkcie dispečera a mechanizmy pre zvýšenie paralelizmu

V superskalárnom procesore dispečer inštrukcií (instruction dispatcher) číta inštrukcie z pamäte, určuje ich závislosti a rozhoduje, ktoré inštrukcie možno spustiť paralelne. Kľúčové mechanizmy, ktoré zvyšujú efektivitu dispečingu, zahŕňajú:

  • Statické a dynamické plánovanie (static vs. dynamic scheduling) — pri dynamickom plánovaní sa rozhoduje počas behu programu, čo zvyšuje adaptabilitu k reálnemu toku inštrukcií.
  • Out-of-order execution (vykonávanie mimo poradia) — inštrukcie sa môžu vykonávať, ak sú pripravené, aj keď sú pôvodne za inými inštrukciami v poradí programu.
  • Register renaming — odstraňuje falošné závislosti spôsobené zdieľaním registrov (WAW a WAR), čím zvyšuje možnosť paralelizmu.
  • Rezervačné stanice a Tomasulov algoritmus — umožňujú dynamickú distribúciu inštrukcií do funkčných jednotiek a riešia závislosti za behu.
  • Reorder buffer — zabezpečuje, že výsledky sa zapíšu do architektonických registrov v správnom poradí (preserving precise exceptions).
  • Predikcia skokov (branch prediction) a spekulatívne vykonávanie — znižujú prestoje spôsobené vetvením programu.

Obmedzenia a problémy

Superskalárna architektúra prináša vyšší výkon, ale narazí na niekoľko limitácií:

  • Dátové závislosti (RAW, WAR, WAW) môžu zabrániť súbežnému vykonávaniu inštrukcií.
  • Strukturálne konflikty — používanie tej istej funkčnej jednotky dvoma inštrukciami súčasne.
  • Kontrolné závislosti spôsobené vetvením programu — zlé predikcie skokov vedú k vyprázdneniu pipeline a stratám cyklov.
  • Obmedzenia pamäte — dlhé latencie prístupu do pamäte a cache misses môžu výrazne znížiť efektívnu vyťaženosť funkčných jednotiek.
  • Komplexnosť návrhu — širší dispečing, renaming a ROB zvyšujú zložitosť, spotrebu energie a plochu čipu.

Metriky výkonu a praktické ukazovatele

Dôležité ukazovatele pre superskalárne CPU sú:

  • IPC (instructions per cycle) — priemerný počet vykonaných inštrukcií za jeden takt. Ideálny IPC sa rovná issue width (maximálny počet inštrukcií, ktoré možno vydať za cyklus), ale reálne býva nižší kvôli závislostiam a iným obmedzeniam.
  • Issue width — napr. dvojsmerný, štvorprúdový (4-way) atď.; udáva, koľko inštrukcií môže dispečer teoreticky poslať do funkčných jednotiek v jednom cykle.
  • Faktická vyťaženosť funkčných jednotiek — percento času, keď sú jednotky v činnosti.

Typy superskalárnych dizajnov a porovnanie

Existujú rôzne prístupy k architektúre:

  • V porovnaní s VLIW (Very Long Instruction Word) — VLIW presúva väčšinu plánovania paralelizmu na kompilátor, zatiaľ čo superskalárny dizajn robí dynamické plánovanie v hardvéri.
  • Superskalárne jednotky môžu byť kombinované so SIMD jednotkami (napríklad vektorové rozšírenia), čím sa dosahuje paralelizmus na dvoch úrovniach súčasne.

Vývoj a súčasné použitie

V praxi sú moderné univerzálne procesory (x86, ARM a pod.) prevažne superskalárne a pipelínové. Typický superskalárny procesor môže obsahovať niekoľko ALU, FPU a ďalších špecializovaných jednotiek; napríklad konfigurácie s 2–4 ALU a 1–2 FPU boli bežné. Pokročilé návrhy môžu mať aj viacnásobné SIMD jednotky či špecializované jednotky pre kryptografiu alebo vektorové operácie.

Návrh superskalárneho procesora sa zameriava na zlepšenie presnosti dispečingu inštrukcií a na udržanie čo najvyššieho počtu aktívnych funkčných jednotiek. Ak dispečer nedokáže udržať jednotky obsadené (napr. kvôli častým závislostiam alebo cache missom), výsledný výkon bude pod maximálnou možnou hranicou.

Pre praktické prípady optimalizácie softvéru a kompilátorov je dôležité písať a generovať kód, ktorý minimalizuje závislosti, zlepšuje lokalitu pamäte a využíva dostupné paralelné prostriedky procesora — tým sa dosiahne vyššie reálne IPC a lepšie využitie superskalárnej architektúry.