Calculatoarele timpurii erau complet secvențiale. Fiecare instrucțiune pe care procesorul a primit-o trebuia completată în întregime în ordine înainte ca următoarea să poată fi pornită. Există cinci etape pentru majoritatea instrucțiunilor: preluarea instrucțiunilor, decodificarea instrucțiunilor, executarea, accesul la memorie și scrierea înapoi. Respectiv aceste etape primesc instrucțiunea care trebuie finalizată, separă operația de valorile fiind operat, executați operația, deschideți registrul în care va fi scris rezultatul și scrieți rezultatul în cel deschis Inregistreaza-te.
Fiecare dintre aceste etape ar trebui să dureze un ciclu pentru a se finaliza. Din păcate, dacă datele nu se află într-un registru, atunci acestea trebuie solicitate din memoria cache a procesorului sau din memoria RAM de sistem. Acest lucru este mult mai lent, adăugând zeci sau sute de cicluri de ceas de latență. Între timp, totul trebuie să aștepte, deoarece alte date sau instrucțiuni nu pot fi procesate. Acest tip de design de procesor este numit subscalar deoarece rulează mai puțin de o instrucțiune pe ciclu de ceas.
Conducte la scalar
Un procesor scalar poate fi realizat prin aplicarea unei conducte de sistem. Fiecare dintre cele cinci etape ale unei instrucțiuni care este executată rulează în diferiți biți de hardware în nucleul actual al procesorului. Astfel, dacă ești atent cu datele pe care le introduci în hardware pentru fiecare etapă, le poți menține ocupat pe fiecare în fiecare ciclu. Într-o lume perfectă, acest lucru ar putea duce la o viteză de 5 ori mai mare și pentru ca procesorul să fie perfect scalar, rulând o instrucțiune completă pe ciclu.
În realitate, programele sunt complexe și reduc debitul. De exemplu, dacă aveți două instrucțiuni de adăugare „a = b + c” și „d = e + f”, acestea pot fi executate într-o conductă fără probleme. Dacă totuși aveți „a = b + c” urmat de „d = a + e” aveți o problemă. Presupunând că aceste două instrucțiuni sunt direct una după alta, procesul de calculare a noii valori a „a” nu se va fi finalizat, darămite să fie scris înapoi în memorie înainte ca a doua instrucțiune să citească vechea valoare a „a” și apoi să dea răspunsul greșit pentru „d”.
Acest comportament poate fi contracarat prin includerea unui dispecer, care analizează instrucțiunile viitoare și se asigură că nicio instrucțiune care este dependentă de alta nu este rulată într-o succesiune prea apropiată. De fapt, rulează programul în ordinea greșită pentru a remedia acest lucru. Acest lucru funcționează, deoarece multe instrucțiuni nu se bazează neapărat pe rezultatul uneia anterioare.
Extinderea conductei la suprascalar
Un procesor superscalar este capabil să ruleze mai mult de o instrucțiune completă pe ciclu. O modalitate de a face acest lucru este extinderea conductei astfel încât să existe două sau mai multe componente hardware care să poată face față fiecărei etape. În acest fel, două instrucțiuni pot fi în fiecare etapă a conductei în fiecare ciclu. Acest lucru are ca rezultat, evident, o complexitate crescută a designului, deoarece hardware-ul este duplicat, cu toate acestea, oferă posibilități excelente de scalare a performanței.
Totuși, creșterea performanței din creșterea conductelor crește doar până acum în mod eficient. Constrângerile termice și de dimensiune pun anumite limite. Există, de asemenea, complicații semnificative de programare. Un dispecer eficient este acum și mai critic, deoarece trebuie să se asigure că niciunul dintre cele două seturi de instrucțiuni nu se bazează pe rezultatul vreuneia dintre celelalte instrucțiuni care sunt procesate.
Un predictor de ramură este o porțiune a dispecerului care devine din ce în ce mai critică cu cât un procesor este mai superscalar. Unele instrucțiuni pot avea două rezultate potențiale, fiecare conducând la instrucțiuni diferite. Un exemplu simplu ar fi o declarație „dacă”. „Dacă acest lucru este adevărat, fă asta, altfel fă și asta”. Un predictor de ramificație încearcă să prezică rezultatul unei operațiuni de ramificare. Apoi programează și execută în mod preventiv instrucțiunile urmând ceea ce crede că este rezultatul probabil.
Există o mulțime de logică complexă în predictorii moderni de ramuri, care poate duce la rate de succes ale predicției ramurilor de ordinul a 98%. O predicție corectă economisește timpul care ar fi putut fi pierdut în așteptarea rezultatului real, o predicție incorectă necesită ca instrucțiunile și oricare dintre rezultatele lor să fie eliminate și instrucțiunile adevărate să fie executate în locul lor, ceea ce vine cu o ușoară penalizare pentru faptul că asteptat. Astfel, ratele de succes înalte de predicție pot crește performanța semnificativ.
Concluzie
Un procesor de computer este considerat superscalar dacă poate executa mai mult de o instrucțiune pe ciclu de ceas. Calculatoarele timpurii erau complet secvențiale, rulând doar o instrucțiune la un moment dat. Acest lucru însemna că fiecare instrucțiune a durat mai mult de un ciclu pentru a fi finalizată și astfel aceste procesoare au fost subscalare. O conductă de bază care permite utilizarea hardware-ului specific pentru fiecare etapă a unei instrucțiuni poate executa cel mult o instrucțiune pe ciclu de ceas, făcându-l scalar.
Trebuie remarcat faptul că nicio instrucțiune individuală nu este procesată complet într-un singur ciclu de ceas. Mai durează cel puțin cinci cicluri. Cu toate acestea, mai multe instrucțiuni pot fi în curs de realizare simultan. Acest lucru permite un debit de una sau mai multe instrucțiuni finalizate pe ciclu.
Superscalar nu trebuie confundat cu hyperscaler care se referă la companiile care pot oferi resurse de calcul hiperscale. Hyperscale computing include capacitatea de a scala fără probleme resursele hardware, cum ar fi calculul, memoria, lățimea de bandă a rețelei și stocarea, în funcție de cerere. Acest lucru se găsește de obicei în centrele de date mari și mediile de cloud computing.