Conducta de calcul

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 18 iunie 2022; verificarea necesită 1 editare .

Pipeline  - o metodă de organizare a calculelor utilizată în procesoarele și controlerele moderne în scopul creșterii performanței acestora (creșterea numărului de instrucțiuni executate pe unitatea de timp - operarea paralelismului la nivel de instrucțiuni ), o tehnologie utilizată în dezvoltarea calculatoarelor și a altor dispozitive electronice digitale.

Descriere

Ideea este de a executa mai multe instrucțiuni de procesor în paralel. Instrucțiunile complexe ale procesorului sunt reprezentate ca o succesiune de pași mai simpli. În loc de a executa instrucțiuni secvențial (așteptând finalizarea sfârșitului unei instrucțiuni și trecerea la următoarea), următoarea instrucțiune poate fi executată prin mai multe etape de execuție a primei instrucțiuni. Acest lucru permite lanțurilor de control ale procesorului să primească instrucțiuni la viteza celei mai lente etape de procesare, dar, în același timp, mult mai rapid decât efectuarea unei procesări complete exclusive a fiecărei instrucțiuni de la început până la sfârșit.

Exemplu

Ilustrația din dreapta arată o conductă simplă cu cinci niveluri în procesoarele RISC . Aici:

Axa verticală este instrucțiuni independente secvențiale, axa orizontală este timpul. Coloana verde descrie starea procesorului la un moment dat, în ea cea mai veche instrucțiune superioară este deja în stare de scriere în registru, iar cea mai recentă instrucțiune inferioară este doar în curs de citire.

Terminologie

Istorie

Termenul „conveior” în sine provine din industrie, care folosește un principiu similar de funcționare  - materialul este tras automat de-a lungul benzii transportoare către muncitor, care efectuează acțiunile necesare cu acesta, lucrătorul care îl urmărește își îndeplinește funcțiile asupra rezultatului. piesa de prelucrat, următorul face altceva. Astfel, până la sfârșitul conductei, lanțul de muncitori finalizează toate sarcinile atribuite, menținând un ritm ridicat de producție. De exemplu, dacă cea mai lentă operațiune durează un minut, atunci fiecare piesă va părăsi linia de asamblare într-un minut. În procesoare, rolul lucrătorilor este îndeplinit de modulele funcționale care fac parte din procesor.

Cea mai simplă formă de execuție a instrucțiunilor suprapuse în timp a fost implementată în mașina Z3 de Konrad Zuse în 1941 [2] .

Tub mic ETSVM " Ural " ( 1957 , URSS ) a avut un transportor în două etape de operațiuni. [3]

Transportoarele cu mai multe etape în perspectiva modernă au fost implementate în mașina M-100 a lui Anatoly Ivanovich Kitov (1959, URSS) [ specificați ] [4] , UNIVAC LARC (1960, SUA), IBM Stretch (1961, SUA) [5] , Atlas (1962, Marea Britanie) și BESM-6 (1967, URSS). În proiectul IBM Stretch, au fost propuși termenii „fetch” ( ing. Fetch ), „decoding” ( ing. Decode ) și „execuție” ( ing. Execute ), care apoi au devenit folosiți în mod obișnuit.    

Relația dintre complexitatea conductei și viteza de ceas a procesorului

Multe procesoare moderne sunt controlate de un generator de ceas. Procesorul din interior este format din elemente logice și celule de memorie - flip- flops . Când sosește semnalul de la generatorul de ceas, flip-flops-urile își iau noua valoare, iar „logica” durează ceva timp pentru a decoda noile valori. Apoi vine următorul semnal de la generatorul de ceas, flip-flops iau noi valori și așa mai departe. Prin ruperea secvențelor elementelor logice în secvențe mai scurte și plasarea flip-flops între aceste secvențe scurte, timpul necesar logicii pentru procesarea semnalelor este redus. În acest caz, durata unui ciclu de procesor poate fi redusă corespunzător.

De exemplu, cea mai simplă conductă de procesoare RISC poate fi reprezentată de cinci etape cu seturi de declanșatori între etape:

  1. primirea instrucțiunilor ( English  Instruction Fetch );
  2. decodarea instrucțiunilor ( Instruction Decode )  și citirea registrului ( Register fetch ); 
  3. execuție ( engleză  Execute );
  4. acces la memorie ( ing.  Acces la memorie );
  5. scrie la registru ( ing.  Register write back ).

Conflicte transportoare

Situațiile, numite conflicte de conducte ( English  hazards ), împiedică executarea următoarei instrucțiuni din fluxul de instrucțiuni în ciclul destinat acestuia. Coliziunile reduc viteza reală a performanței conductei și pot cauza oprirea conductei . Rezolvarea conflictelor necesită ca unele instrucțiuni aflate în curs să poată continua să se execute, în timp ce altele sunt întârziate.

Există trei clase de conflicte [6] .

Conflicte structurale

Conflictele structurale apar din cauza conflictelor de resurse, atunci când hardware-ul nu poate suporta toate combinațiile posibile de instrucțiuni executate simultan [7] . Dacă o combinație de instrucțiuni nu poate fi acceptată, atunci se spune că procesorul are un conflict structural . Cel mai adesea, conflictele structurale apar atunci când un anumit bloc funcțional nu este complet canalizat. De exemplu, unele procesoare partajează o singură conductă de memorie pentru date și instrucțiuni. Ca rezultat, atunci când o instrucțiune conține un acces la memoria de date, aceasta intră în conflict cu o instrucțiune ulterioară. Pentru a rezolva acest conflict la accesarea memoriei pentru date, conducta se întrerupe pentru un ciclu.

Ca o alternativă la un astfel de conflict structural, dezvoltatorul ar putea oferi acces separat la memoria de instrucțiuni fie prin împărțirea cache-ului în cache-uri separate de instrucțiuni și cache-uri de date, fie prin utilizarea mai multor buffer-uri numite buffer-uri de instrucțiuni pentru a stoca instrucțiuni, cu toate acestea, acest lucru nu se face în ordine. pentru a evita creșterea costului blocului [ 8] .

Conflicte de date

Conflictele de date apar atunci când dependența unei comenzi de rezultatele uneia anterioare apare atunci când comenzile sunt combinate într-o conductă. Aceste conflicte apar atunci când conducta modifică ordinea acceselor de citire/scriere la operanzi, astfel încât aceasta să difere de ordinea care există pentru instrucțiunile executate secvenţial într-un procesor fără o conductă. Există o metodă de rezolvare a conflictelor de date: forwarding ( în engleză  register forwarding ) (uneori numită bypass ) [9] . Din păcate, nu toate conflictele potențiale de date pot fi gestionate folosind un bypass, caz în care conducta este suspendată până când conflictul este rezolvat.

Conflicte de management

Conflictele de control apar atunci când se execută transferuri condiționate și alte instrucțiuni care modifică valoarea contorului programului . Există multe modalități de a gestiona o oprire a conductei cauzată de întârzierea transferului de control, dar conductele adânci tind să folosească instrumente agresive [10] , cum ar fi predicția transferului de control .

Arhitectură fără conducte

Arhitectura fără conducte este mult mai puțin eficientă datorită încărcării mai mici a modulelor funcționale ale procesorului , în timp ce unul sau un număr mic de module își îndeplinesc funcția în timpul procesării instrucțiunilor. Conducta nu elimină complet timpul de inactivitate al modulelor din procesoare și nu reduce timpul de execuție al fiecărei instrucțiuni specifice, dar forțează modulele procesorului să lucreze în paralel pe diferite instrucțiuni, crescând astfel numărul de instrucțiuni executate pe unitatea de timp. și, prin urmare, performanța generală a programelor.

Procesoarele cu o conductă în interior sunt proiectate astfel încât procesarea instrucțiunilor să fie împărțită într-o succesiune de etape, presupunând procesarea simultană a mai multor instrucțiuni în etape diferite. Rezultatele muncii fiecăreia dintre etape sunt transferate prin celulele de memorie în etapa următoare și așa mai departe până când instrucțiunea este executată. O astfel de organizare a procesorului, cu o ușoară creștere a timpului mediu de execuție al fiecărei instrucțiuni, oferă totuși o creștere semnificativă a performanței datorită frecvenței mari de finalizare a instrucțiunilor.

Cu toate acestea, nu toate instrucțiunile sunt independente. În cea mai simplă conductă, în care procesarea instrucțiunilor este reprezentată de cinci etape, pentru a asigura încărcarea completă, în timp ce procesarea primei instrucțiuni este finalizată, în mod ideal, ar trebui procesate în paralel încă patru instrucțiuni independente secvențiale. Dacă secvența conține instrucțiuni dependente de cele care se execută în prezent, atunci logica de control a celei mai simple conducte suspendă mai multe etape inițiale ale conductei, plasând astfel o instrucțiune goală („bulă”) în conductă, uneori în mod repetat, până când dependența este rezolvată. Există o serie de trucuri, cum ar fi redirecționarea, care reduc foarte mult nevoia de a întrerupe o parte a conductei în astfel de cazuri. Totuși, dependența dintre instrucțiunile procesate simultan de procesor nu permite realizarea unei creșteri de performanță multiplu a numărului de etape pipeline în comparație cu un procesor fără pipeline.

Avantaje și dezavantaje

Conducta nu ajută în toate cazurile. Există mai multe dezavantaje posibile. O conductă de instrucțiuni poate fi numită „complet canalizat” dacă poate accepta o nouă instrucțiune la fiecare ciclu de mașină . În caz contrar, întârzierile trebuie forțate în conductă care aplatizează conducta în timp ce îi degradează performanța.

Avantaje:

  1. Timpul ciclului procesorului este redus, crescând astfel viteza de procesare a instrucțiunilor în majoritatea cazurilor.
  2. Unele elemente logice combinaționale, cum ar fi sumatorii sau multiplicatorii, pot fi accelerate prin creșterea numărului de elemente logice. Utilizarea unei conducte poate preveni creșterea inutilă a numărului de elemente.

Defecte:

  1. Un procesor fără conducte execută o singură instrucțiune la un moment dat. Acest lucru previne întârzierile ramurilor de instrucțiuni (de fapt, fiecare ramificare este întârziată) și problemele asociate cu instrucțiunile secvențiale care sunt executate în paralel. Prin urmare, circuitul unui astfel de procesor este mai simplu și este mai ieftin de fabricat.
  2. Latența instrucțiunilor într-un procesor fără pipeline este puțin mai mică decât într-un echivalent pipeline. Acest lucru se datorează faptului că trebuie adăugate declanșatoare suplimentare la procesorul pipeline .
  3. Un procesor fără conducte are o viteză stabilă de procesare a instrucțiunilor. Performanța unui procesor pipeline este mult mai dificil de prezis și poate varia foarte mult între programe.

Exemple

Conductă generală

În dreapta este o conductă generală cu patru etape de lucru:

  1. Preluare _  _ _
  2. Decodare _  _ _
  3. Execuție _  _ _
  4. Înregistrarea rezultatului ( ing.  Scriere înapoi )

Zona superioară gri este o listă de instrucțiuni care trebuie executate. Zona de jos gri este o listă de instrucțiuni care au fost deja executate. Și zona albă din mijloc este conducta în sine.

Execuția decurge astfel:

Ciclu Acțiuni
0 Patru instrucțiuni sunt în așteptarea executării
unu
  • Instrucțiunea verde este preluată din memorie
2
  • Instrucțiunea verde este decodificată
  • Instrucțiunea violet este luată din memorie
3
  • Se execută instrucțiunea verde (adică se execută acțiunea pe care a codificat-o)
  • Instrucțiunea violet este decodificată
  • Instrucțiunea albastră este preluată din memorie
patru
  • Rezultatele execuției instrucțiunii verzi sunt scrise în registre sau memorie
  • Instrucțiune violetă în curs
  • Instrucțiunea albastră este decodificată
  • Instrucțiunea roșie este luată din memorie
5
  • Instrucțiunea verde s-a încheiat
  • Rezultatele execuției instrucțiunii violet sunt scrise în registre sau memorie
  • Instrucțiunea albastră este în curs de execuție
  • Decodificarea instrucțiunilor roșii
6
  • Instrucțiunea violet s-a încheiat
  • Rezultatele executării instrucțiunii albastre sunt scrise în registre sau memorie
  • Instrucțiune roșie în curs
7
  • Instrucțiunea albastră s-a încheiat
  • Rezultatele executării instrucțiunii roșii sunt scrise în registre sau memorie
opt
  • Instrucțiunea roșie s-a încheiat
9 Toate instrucțiunile au fost respectate
Bubble

Pentru a rezolva conflictele în conductă, procesorul este forțat să întârzie procesarea instrucțiunii prin crearea unei „bule” în conductă. Trecerea bulei prin actuatoare nu este însoțită de nicio lucrare utilă. În al doilea ciclu, procesarea instrucțiunii violet este întârziată, iar acum există o bulă în etapa de decodare în al treilea ciclu. Toate instrucțiunile „după” instrucțiunea violet sunt întârziate cu un ciclu, în timp ce instrucțiunile „înainte” instrucțiunii violet continuă să fie executate.

Evident, prezența unei bule în conductă oferă un timp total de execuție de 8 cicluri în loc de 7 în diagrama de execuție prezentată mai sus.

Actuatoarele trebuie să efectueze o anumită acțiune pe fiecare ciclu. Bulele sunt o modalitate de a crea o întârziere în procesarea unei instrucțiuni fără a opri conducta. Când sunt executate, nu are loc nicio lucrare utilă în etapele de preluare, decodare, execuție și scriere a rezultatului. Ele pot fi exprimate folosind instrucțiunea de asamblare NOP [11] [12] [13] .

Exemplul 1

Să presupunem că o instrucțiune tipică pentru adăugarea a două numere este СЛОЖИТЬ A, B, C. Această instrucțiune adaugă valorile în locațiile de memorie A și B și apoi pune rezultatul în locația de memorie C. Într-un procesor pipeline, controlorul poate împărți această operație în sarcini secvențiale ale formularului

LOAD A , R1 LOAD B , R2 ADD R1 , R2 , R3 WRITE R3 , C încărcați următoarea instrucțiune

Celulele R1 , R2 și R3 sunt registre de procesor . Valorile care sunt stocate în locațiile de memorie, pe care le numim A și B , sunt încărcate (adică, copiate) în aceste registre, apoi însumate, iar rezultatul este scris în locația de memorie C.

În acest exemplu, conducta constă din trei niveluri - încărcare, execuție și scriere. Acești pași sunt, în mod evident, numiți niveluri sau pași de conductă .

Într-un procesor fără conducte, doar un pas poate rula o dată, așa că o instrucțiune trebuie să se termine complet înainte ca următoarea instrucțiune să poată începe. Într-un procesor pipeline, toți acești pași pot fi executați simultan, pe diferite instrucțiuni. Deci, când prima instrucțiune este în pasul de execuție, a doua instrucțiune va fi în etapa de decodare și a treia instrucțiune va fi în etapa de citire.

Conducta nu reduce timpul necesar pentru executarea unei instrucțiuni, dar crește cantitatea (numărul) de instrucțiuni care pot fi executate în același timp și astfel reduce întârzierea dintre instrucțiunile executate - crescând așa-numitele. debitul . Cu cât o conductă are mai multe straturi, cu atât mai multe instrucțiuni pot fi executate în același timp și cu atât mai puțină întârziere între instrucțiunile finalizate. Fiecare microprocesor fabricat astăzi utilizează cel puțin o conductă cu două niveluri.

Exemplul 2

Conductă teoretică pe trei niveluri:

Etapa Engleză titlu Descriere
Probă Preluare Citiți instrucțiunile din memorie
Execuţie A executa Executați instrucțiunea
Înregistrare Scrie înapoi Scrieți rezultatul în memorie și/sau în registre

Listarea pseudo-asamblerilor care urmează să fie executată:

ÎNCĂRCARE 40, A ; încărcați numărul 40 în A COPIE A , B ; copie A la B ADD 20, B ; adăugați 20 la B WRITE B , 0x0300 ; scrieți B în locația de memorie 0x0300

Cum va fi executat:

Tact Probă Execuţie Înregistrare Explicaţie
Măsura 1 DESCARCA Instrucțiunea LOAD este citită din memorie.
Măsura 2 COPIE DESCARCA Instrucțiunea LOAD este executată, instrucțiunea COPY este citită din memorie.
Măsura 3 FOLD COPIE DESCARCA Instrucțiunea LOAD se află în pasul de scriere a rezultatului, unde rezultatul său (adică numărul 40 ) este scris în registrul A . În același timp, este executată instrucțiunea COPY. Deoarece trebuie să copieze conținutul registrului A în registrul B , trebuie să aștepte până la sfârșitul instrucțiunii LOAD.
Măsura 4 RECORD FOLD COPIE Instrucțiunea WRITE este încărcată, în timp ce instrucțiunea COPY ne spune la revedere, iar instrucțiunea ADD este în prezent calculată.

Si asa mai departe. Rețineți că uneori instrucțiunile vor depinde de rezultatul altor instrucțiuni (cum ar fi instrucțiunea COPY, de exemplu). Când mai multe instrucțiuni se referă la o anumită locație, fie citind-o (adică folosind-o ca operand de intrare), fie scriind la ea (adică folosind-o ca operand de ieșire), execuția instrucțiunilor nu este în ordinea care a fost inițial intenționată în programul original. , poate provoca un conflict de conductă , (după cum s-a menționat mai sus). Există mai multe tehnici dovedite fie pentru a preveni conflictele, fie pentru a le remedia dacă apar.

Dificultăți

Multe scheme includ conducte de 7, 10 sau chiar 20 de niveluri (ca, de exemplu, în procesorul Pentium 4 ). Late Pentium 4 nuclee cu nume de cod Prescott și Cedar Mill (și derivatele lor Pentium D ) au o conductă de 31 de niveluri.

Procesorul Xelerator X10q are o conductă lungă de peste o mie de pași [14] . Reversul monedei în acest caz este necesitatea de a reseta întreaga conductă în cazul în care fluxul programului s-a schimbat (de exemplu, printr-o declarație condiționată). Predictorii de ramuri încearcă să rezolve această problemă . Predicția ramurilor în sine poate înrăutăți lucrurile doar dacă predicția este făcută prost. În unele aplicații, cum ar fi supercalculatura , programele sunt scrise special pentru a utiliza instrucțiunile condiționate cât mai puțin posibil, astfel încât conductele foarte lungi vor avea un efect foarte pozitiv asupra vitezei generale a calculelor, deoarece conductele lungi sunt concepute pentru a reduce CPI ( numărul de cicluri ). la instrucțiunea ).

Dacă ramificarea are loc tot timpul, rearanjarea instrucțiunilor mașinii va ajuta la reducerea semnificativă a pierderii de viteză: instrucțiunile care sunt cel mai probabil necesare sunt plasate în conductă. Această metodă este mai eficientă decât a trebui să resetați complet conducta de fiecare dată. Programe precum gcov pot fi utilizate pentru a determina cât de des sunt executate efectiv ramurile individuale, folosind o tehnică cunoscută sub numele de analiză a acoperirii codului .  Deși în practică, o astfel de analiză este ultima măsură în optimizare.

Debitul mare de conducte duce la o scădere a performanței dacă codul executabil conține multe salturi condiționate: procesorul nu știe de unde să citească următoarea instrucțiune și, prin urmare, trebuie să aștepte ca instrucțiunea de salt condiționat să se termine, lăsând un conductă goală în spatele ei. Odată ce ramura a fost parcursă și se știe unde trebuie să sară procesorul în continuare, următoarea instrucțiune va trebui să treacă prin conductă înainte ca rezultatul să fie disponibil și procesorul „funcționează” din nou. Într-un caz extrem, performanța unui procesor pipeline ar putea scădea teoretic la cea a unui procesor pipelineless, sau chiar să fie mai proastă datorită faptului că doar un nivel al conductei este ocupat și există o mică întârziere între niveluri.

Dacă procesorul este echipat cu o conductă, codul citit din memorie nu este executat imediat, ci plasat într-o coadă ( prefetch input queue ). Dacă codul conținut în memorie este modificat, codul conținut în coada pipeline va rămâne același. De asemenea, instrucțiunile din memoria cache de instrucțiuni nu se vor modifica . Trebuie luat în considerare faptul că această problemă este tipică numai pentru programele care se auto-modifica și pentru pachetele de fișiere executabile .

Vezi și

Note

  1. Glaskowsky, Peter N. Prescott Pushes Pipelining Limits Arhivat 8 aprilie 2017 la Wayback Machine // Microprocessor Report, 2 februarie  2004
  2. Raul Rojas. Primele calculatoare: istorie și arhitecturi . - MIT Press, 2002. - S. 249. - 472 p. — ISBN 0-262-68137-4 .
  3. Smolnikov N. Ya. Fundamentele programării pentru mașina digitală Ural . - Radio sovietică, 1961. - S. 83. - 328 p.
  4. Revich Yuri Vsevolodovich, Malinovsky B. Tehnologii informaționale în URSS. Creatorii tehnologiei informatice sovietice . - BHV-Petersburg, 2014. - 336 p.
  5. Harvey G. Cragon. Sisteme de memorie și procesoare pipeline . - Jones și Bartlett Learning, 1996. - S. 289. - 575 p. - ISBN 0-86720-474-5 .
  6. Morgan Kaufmann Publishers , Computer Organization and Design , David A. Patterson & John L. Hennessy , Ediția 3, ISBN 1-55860-604-1 , pagina 738
  7. Morgan Kaufmann Publishers , Computer Organization and Design , David A. Patterson & John L. Hennessy , Ediția 3, ISBN 1-55860-604-1 , pagina 740
  8. Morgan Kaufmann Publishers , Computer Organization and Design , David A. Patterson & John L. Hennessy , Ediția 3, ISBN 1-55860-604-1 , pagina 743
  9. Morgan Kaufmann Publishers , Computer Organization and Design , David A. Patterson & John L. Hennessy , Ediția 3, ISBN 1-55860-604-1 , pagina 745
  10. Morgan Kaufmann Publishers , Computer Organization and Design , David A. Patterson & John L. Hennessy , Ediția 3, ISBN 1-55860-604-1 , pagina 756
  11. „Pentru cazul blocării, o bulă (instrucțiunea NOP) este trimisă la următoarea etapă a conductei și toate etapele anterioare se blochează pentru un pas de timp” // CPU - RISC 32 de biți Arhivat 4 noiembrie 2011 la Wayback Machine
  12. „stream a pipeline bubble, sau NOP, must be inserted” // Paralelism la nivel de instrucțiune în procesoarele VLIW Arhivat 20 septembrie 2008 la Wayback Machine
  13. „Bubbles are NOP instructions” // Pipelined Processor Design Arhivat 3 ianuarie 2017 la Wayback Machine
  14. Grupul Linley - Cel mai bun procesor extrem: X10q Xelerat . Consultat la 17 noiembrie 2012. Arhivat din original pe 15 decembrie 2013.

Literatură

Link -uri