Pipelining-Ul de instrucțiuni

Pipelining-ul de instrucțiuni este o tehnică utilizată în proiectarea microprocesoarelor, microcontrolerelor și a procesoarelor moderne pentru a crește randamentul de instrucțiuni (numărul de instrucțiuni care pot fi executate într-o unitate de timp).

Ideea principală este de a diviza (denumită "divizare") procesarea unei instrucțiuni CPU, așa cum este definită de microcodul instrucțiunii, într-o serie de etape independente de microoperații (denumite și "microinstrucțiuni", "micro-op" sau "µop"), cu stocare la sfârșitul fiecărei etape. Acest lucru permite logicii de control a CPU să trateze instrucțiunile la rata de procesare a celui mai lent pas, care este mult mai rapidă decât timpul necesar pentru a procesa instrucțiunea ca pas unic.

Termenul de "conductă" se referă la faptul că fiecare pas transportă o singură microinstrucțiune (ca o picătură de apă), iar fiecare pas este legat de un alt pas (analogie; similar cu conductele de apă).

Majoritatea procesoarelor moderne sunt conduse de un ceas. Unitatea centrală de procesare este formată în interior din logică și memorie (flip-flops). Când sosește semnalul de ceas, flip-flops-urile își stochează noua valoare, apoi logica are nevoie de o perioadă de timp pentru a decoda noile valori ale flip-flops-urilor. Apoi sosește următorul impuls de ceas și flip flopurile stochează alte valori, și așa mai departe. Prin împărțirea logicii în bucăți mai mici și prin inserarea flip flop-urilor între bucățile de logică, timpul necesar logicii (pentru a decoda valorile până la generarea de ieșiri valide în funcție de aceste valori) este redus. În acest fel, perioada de ceas poate fi redusă. De
exemplu, pipeline-ul RISC este împărțit în cinci etape cu un set de flip flop-uri între fiecare etapă, după cum urmează:

  1. Preluare de instrucțiuni
  2. Decodarea instrucțiunilor și preluarea registrelor
  3. Executați
  4. Accesul la memorie
  5. Scrierea înapoi în registru

Procesoarele cu pipelining constau, la nivel intern, din etape (module) care pot lucra în mod semi-independent la microinstrucțiuni separate. Fiecare etapă este legată prin flip-flops de următoarea etapă (ca un "lanț"), astfel încât ieșirea etapei să fie o intrare pentru o altă etapă până la terminarea prelucrării instrucțiunilor. O astfel de organizare a modulelor interne ale procesorului reduce timpul total de procesare a instrucțiunilor.

O arhitectură fără linie de bază nu este la fel de eficientă deoarece unele module CPU sunt inactive în timp ce un alt modul este activ în timpul ciclului de instrucțiuni. Pipelining-ul nu elimină complet timpul de inactivitate într-o unitate centrală de procesare cu pipe-line, dar faptul că modulele unității centrale de procesare lucrează în paralel crește randamentul instrucțiunilor.

Se spune că un pipeline de instrucțiuni este complet pipeline dacă poate accepta o nouă instrucțiune la fiecare ciclu de ceas. O conductă care nu este complet conectată are cicluri de așteptare care întârzie progresul conductei.

Conducta de bază în cinci etape într-o mașină RISC (IF = Preluare de instrucțiuni, ID = Decodare de instrucțiuni, EX = Executare, MEM = Acces la memorie, WB = Scriere în registru). Axa verticală reprezintă instrucțiunile succesive, iar axa orizontală reprezintă timpul. Astfel, în coloana verde, cea mai veche instrucțiune se află în etapa WB, iar cea mai recentă instrucțiune este în curs de preluare a instrucțiunilor.Zoom
Conducta de bază în cinci etape într-o mașină RISC (IF = Preluare de instrucțiuni, ID = Decodare de instrucțiuni, EX = Executare, MEM = Acces la memorie, WB = Scriere în registru). Axa verticală reprezintă instrucțiunile succesive, iar axa orizontală reprezintă timpul. Astfel, în coloana verde, cea mai veche instrucțiune se află în etapa WB, iar cea mai recentă instrucțiune este în curs de preluare a instrucțiunilor.

Avantaje și dezavantaje ale Pipelining-ului

Avantajele Pipelining:

  1. Timpul de ciclu al procesorului este redus, ceea ce crește randamentul instrucțiunilor. Pipelining-ul nu reduce timpul necesar pentru a finaliza o instrucțiune; în schimb, crește numărul de instrucțiuni care pot fi procesate simultan ("deodată") și reduce întârzierea dintre instrucțiunile finalizate (numită "throughput").
    Cu cât un procesor are mai multe etaje pipeline, cu atât mai multe instrucțiuni pot fi procesate "simultan" și cu atât mai puțin timp trece între instrucțiunile finalizate. Fiecare microprocesor
     generalist predominant fabricat în prezent utilizează cel puțin 2 etape de pipeline, până la 30 sau 40 de etape.
  2. În cazul în care se utilizează pipelining, unitatea logică aritmetică a procesorului poate fi proiectată mai rapid, dar va fi mai complexă.
  3. În teorie, pipeline-ul crește performanța față de un nucleu nepipelinat cu un factor egal cu numărul de etape (presupunând că frecvența ceasului crește cu același factor), iar codul este ideal pentru execuția pipeline.
  4. În general, procesoarele în linie funcționează la o frecvență de ceas mai mare decât frecvența de ceas a memoriei RAM (începând cu tehnologiile din 2008, memoriile RAM funcționează la frecvențe scăzute în comparație cu frecvențele procesoarelor), ceea ce crește performanța generală a calculatoarelor.

Dezavantajele Pipelining-ului:

Pipelining-ul are multe dezavantaje, deși există o mulțime de tehnici utilizate de procesoare și de proiectanții de compilații pentru a depăși majoritatea acestora; în continuare este prezentată o listă a dezavantajelor comune:

  1. Proiectarea unui procesor nepipeliniat este mai simplă și mai ieftină la fabricare, procesorul nepipeliniat execută doar o singură instrucțiune la un moment dat. Acest lucru previne întârzierile de ramificare (în Pipelining, fiecare ramificare este întârziată), precum și problemele legate de executarea concomitentă a instrucțiunilor în serie.
  2. În cazul procesoarelor cu linie de conducte, inserția de flip-flops între module crește latența instrucțiunilor în comparație cu un procesor fără linie de conducte.
  3. Un procesor nepipeliniat va avea un debit de instrucțiuni definit. Performanța unui procesor cu linie de conducte este mult mai greu de prezis și poate varia foarte mult în funcție de diferite programe.
  4. Multe proiecte includ conducte lungi de 7, 10, 20, 31 și chiar mai multe etape; un dezavantaj al unei conducte lungi este că, atunci când un program se ramifică, întreaga conductă trebuie să fie curățată (curățată). Randamentul mai mare al conductelor nu este satisfăcător atunci când codul executat conține multe ramificații: procesorul nu poate ști dinainte unde să citească următoarea instrucțiune și trebuie să aștepte ca instrucțiunea de ramificare să se termine, lăsând conducta din spatele ei goală. Acest dezavantaj poate fi redus prin prezicerea faptului că o instrucțiune de ramificare condiționată se va ramifica pe baza activității anterioare. După ce ramificarea este rezolvată, următoarea instrucțiune trebuie să parcurgă tot drumul prin pipeline înainte ca rezultatul său să devină disponibil și procesorul să își reia "activitatea" din nou. În astfel de cazuri extreme, performanța unui procesor cu linie de conducte ar putea fi mai slabă decât cea a unui procesor fără linie de conducte.
  5. Din păcate, nu toate instrucțiunile sunt independente. Într-un pipeline simplu, finalizarea unei instrucțiuni poate necesita 5 etape. Pentru a funcționa la performanțe maxime, acest pipeline va trebui să execute 4 instrucțiuni independente ulterioare în timp ce prima se finalizează. Oricare dintre aceste 4 instrucțiuni ar putea depinde de ieșirea primei instrucțiuni, determinând logica de control a pipeline-ului să aștepte și să introducă un blocaj sau un ciclu de ceas irosit în pipeline până când dependența este rezolvată. Din fericire, tehnici precum forwarding-ul pot reduce semnificativ cazurile în care este necesară blocarea.
  6. Este posibil ca programele de auto-modificare să nu se execute corect pe o arhitectură în linie atunci când instrucțiunile modificate se află în apropierea instrucțiunilor care se execută. Acest lucru poate fi cauzat de faptul că instrucțiunile pot fi deja în coada de intrare Prefetch, astfel încât modificarea poate să nu aibă efect pentru următoarea execuție a instrucțiunilor. Antrepozitele de instrucțiuni agravează și mai mult problema.
  7. Pericole: Atunci când un programator (sau un compilator) scrie cod de asamblare, acesta presupune, în general, că fiecare instrucțiune este executată înainte ca următoarea instrucțiune să fie executată. Atunci când această presupunere nu este validată prin pipelining, programul se comportă incorect, situație cunoscută sub numele de "hazard". Există
    diverse
    tehnici de rezolvare a pericolelor sau de evitare a acestora, cum ar fi redirecționarea și întârzierea (prin introducerea unui blocaj sau a unui ciclu de ceas irosit).

Exemple

Conducta generică

În dreapta este prezentată o conductă generică cu patru etape:

  1. Aduceți
  2. Decodare
  3. Executați
  4. Scriere înapoi

Caseta gri de sus reprezintă lista instrucțiunilor care așteaptă să fie executate; caseta gri de jos reprezintă lista instrucțiunilor care au fost finalizate; iar caseta albă din mijloc reprezintă conducta.

Executarea se face după cum urmează:

Timp

Execuție

0

Patru instrucțiuni așteaptă să fie executate

1

  • instrucțiunea verde este preluată din memorie

2

  • instrucțiunea verde este decodificată
  • instrucțiunea violet este preluată din memorie

3

  • se execută instrucțiunea verde (se efectuează operațiunea efectivă)
  • instrucțiunea violet este decodificată
  • instrucțiunea albastră este preluată

4

  • rezultatele instrucțiunii verzi sunt scrise înapoi în fișierul de registre sau în memorie.
  • se execută instrucțiunea violet
  • instrucțiunea albastră este decodificată
  • instrucțiunea roșie este preluată

5

  • instrucțiunea verde este finalizată
  • instrucțiunea violet este scrisă înapoi
  • se execută instrucțiunea albastră
  • instrucțiunea roșie este decodificată

6

  • Instrucțiunea violet este finalizată
  • instrucțiunea albastră este scrisă înapoi
  • se execută instrucțiunea roșie

7

  • instrucțiunea albastră este finalizată
  • instrucțiunea roșie este scrisă înapoi

8

  • instrucțiunea roșie este finalizată

9

Toate instrucțiunile sunt executate

Bubble

Atunci când are loc o "sughiț" (întrerupere) în execuție, se creează o "bulă" în conducta în care nu se întâmplă nimic util. În ciclul 2, preluarea instrucțiunii violet este întârziată, iar etapa de decodare din ciclul 3 conține acum o bulă. Tot ceea ce se află în spatele instrucțiunii mov este, de asemenea, întârziat, dar tot ceea ce se află în fața instrucțiunii mov continuă execuția.

În mod evident, în comparație cu execuția de mai sus, bula produce un timp total de execuție de 8 ticuri de ceas în loc de 7.

Bulele sunt ca niște blocaje (întârzieri), în care nu se va întâmpla nimic util pentru preluare, decodare, execuție și revenire la scriere. Este ca un cod NOP (prescurtare de la No OPeration).

Exemplul 1

O instrucțiune tipică de adunare a două numere ar putea fi ADD A, B, C, care adună valorile aflate în locațiile de memorie A și B și apoi plasează rezultatul în locația de memorie C. Într-un procesor pipeline, controlerul pipeline ar împărți această instrucțiune într-o serie de sarcini similare cu:

LOAD A, R1 LOAD B, R2 ADD R1, R2, R3 STORE R3, C LOAD următoarea instrucțiune

Pozițiile "R1" și "R2" sunt registre din CPU. Valorile stocate în locațiile de memorie etichetate "A" și "B" sunt încărcate (copiate) în aceste registre, apoi sunt adăugate, iar rezultatul este stocat într-o locație de memorie etichetată "C".

În acest exemplu, pipeline-ul este format din trei etape - încărcare, execuție și stocare. Fiecare dintre aceste etape se numește "pipeline stages".

La un procesor nepipeliniat, doar o singură etapă poate funcționa în același timp, astfel încât întreaga instrucțiune trebuie să fie finalizată înainte ca următoarea instrucțiune să poată începe. La un procesor cu linie de conducte, toate etapele pot lucra în același timp la instrucțiuni diferite. Astfel, atunci când această instrucțiune se află în etapa de execuție, o a doua instrucțiune se va afla în etapa de decodificare și o a treia instrucțiune se va afla în etapa de preluare.

Exemplul 2

Pentru a înțelege mai bine acest concept, ne putem uita la o conductă teoretică în trei etape:

Etapa

Descriere

Încărcare

Instrucțiune de citire din memorie

Executați

Executarea instrucțiunii

Magazin

Stocarea rezultatului în memorie și/sau în registre

și o listă de asamblare cu pseudocoduri care urmează să fie executată:

LOAD #40, A ; încarcă 40 în A MOVE A, B ; copiază A în B ADD #20, B ; adaugă 20 în B STORE B, 0x300 ; stochează B în celula de memorie 0x300

Acesta este modul în care ar fi executat:

Ceas 1

Încărcare

Executați

Magazin

ÎNCĂRCARE

 

 

Instrucțiunea LOAD este preluată din memorie.

Ceas 2

Încărcare

Executați

Magazin

MUTARE

ÎNCĂRCARE

 

Instrucțiunea LOAD este executată, în timp ce instrucțiunea MOVE este preluată din memorie.

Ceasul 3

Încărcare

Executați

Magazin

ADD

MUTARE

ÎNCĂRCARE

Instrucțiunea LOAD se află în etapa de memorare, unde rezultatul său (numărul 40) va fi stocat în registrul A. Între timp, se execută instrucțiunea MOVE. Deoarece aceasta trebuie să mute conținutul lui A în B, trebuie să aștepte sfârșitul instrucțiunii LOAD.

Ceas 4

Încărcare

Executați

Magazin

MAGAZIN

ADD

MUTARE

Instrucțiunea STORE este încărcată, în timp ce instrucțiunea MOVE se termină, iar instrucțiunea ADD este în curs de calcul.

Și așa mai departe. Rețineți că, uneori, o instrucțiune va depinde de rezultatul altei instrucțiuni (cum ar fi exemplul nostru MOVE). Atunci când mai multe instrucțiuni fac referire la o anumită locație pentru un operand, fie că îl citesc (ca intrare), fie că îl scriu (ca ieșire), executarea acestor instrucțiuni într-o ordine diferită de ordinea inițială a programului poate duce la situația de hazard (menționată mai sus).

O bulă în ciclul 3 întârzie execuțiaZoom
O bulă în ciclul 3 întârzie execuția

Pipeline generic cu 4 etape; casetele colorate reprezintă instrucțiuni independente una de cealaltăZoom
Pipeline generic cu 4 etape; casetele colorate reprezintă instrucțiuni independente una de cealaltă

Pagini conexe

  • Conducte (calculatoare)
  • Calcul paralel
  • Paralelismul la nivel de instrucțiuni

Întrebări și răspunsuri

Î: Ce este pipe-line-ul de instrucțiuni?


R: Pipelining-ul instrucțiunilor este o tehnică utilizată în proiectarea microprocesoarelor, microcontrolerelor și a unităților centrale de procesare moderne pentru a crește debitul de instrucțiuni prin împărțirea procesării unei instrucțiuni a unității centrale de procesare într-o serie de pași independenți, cu stocare la sfârșitul fiecărui pas.

Î: Cum funcționează pipelining-ul?


R: Pipelining-ul funcționează prin împărțirea logicii în bucăți mai mici și prin inserarea de flip-flops între bucățile de logică, ceea ce reduce timpul necesar pentru ca logica să decodifice valori până la generarea de ieșiri valide în funcție de aceste valori. Acest lucru permite obținerea unor perioade de ceas mai rapide.

Î: Care sunt câteva exemple de conducte?


R: Un exemplu de pipeline este pipeline-ul RISC, care este împărțit în cinci etape cu un set de flip flop-uri între fiecare etapă.

Î: În ce mod crește pipeline-ul debitul de instrucțiuni?


R: Pipelining-ul mărește randamentul instrucțiunilor permițând modulelor CPU să lucreze în paralel, ceea ce reduce timpul de inactivitate în timpul unui ciclu de instrucțiuni și mărește timpul total de procesare.

Î: Fiecare pipeline este complet pipelinat?


R: Nu, nu toate pipeline-urile sunt complet pipeline; unele pipeline-uri au cicluri de așteptare care întârzie progresul în pipeline.

AlegsaOnline.com - 2020 / 2023 - License CC3