Paralelizare la nivel de instrucțiune
Paralelizarea la nivel de instrucțiune este denumirea dată unei suite de metode de proiectare (atât hardware cât și software) pentru majoritatea familiilor de procesoare si compilatoare în scopul măririi vitezei de execuție. Mărirea vitezei de execuție se face prin rularea în paralel a mai multor operații. Încă de la începutul anilor 1970, odată cu avântul sistemelor de calcul, și dezvoltării arhitecturilor de tip microprocesor a apărut o nevoie stringentă pentru a micșora timpul execuție al unui program, prin artificii de arhitectură hardware (arhitecturi orientate către paralelizare) și software (la nivel de compilator). Datorită trecerii de la sisteme de calcul analogice la sisteme de calcul digitale a marilor companii în ce privește infrastructura IT costul asociat implementării unor funcționalități precum paralelismul la nivel de instrucțiune, paralelismul la nivel de memorie a fost justificat,deoarece prin implementarea acestor funcționalități au fost satisfăcute necesitățile companiilor respective la acel moment. Aceste funcționalități au fost apoi preluate în toate versiunile de microprocesoare, inclusiv cele lansate pe piață la ora actuală.

Scopul paralelizării la nivel de instruțiune 
 Interesul din spatele paralelizării la nivel de instrucțiune este mărirea vitezei de execuție a instrucțiunilor ce în totalitatea lor alcătuiesc un program. Metrica prin care se măsoară viteza de execuție se numește număr de cicli per instrucțiune (eng. Cycles per Instruction). În mod obișnuit un microprocesor pe bază de pipeline-uri realizează o instrucțiune într-un ciclu mașină. Obținerea unei viteze mai mari la procesarea datelor înseamnă executarea unui număr mai mare de instrucțiuni într-un ciclu instrucțiune. Acest lucru se poate realiza prin două metode:
 Mărirea cantității de informații procesate prin fragmentarea etapelor pipeline  
 Mărirea numărului de instrucțiuni per ciclu prin implementarea mai multor căi de acces la date

Modul în care trebuie privit un pipeline este asemănător cu o linie de asamblare pentru autovehicule, procesul fiind secvențial.
Un ciclu instrucțiune este alcătuit din cinci etape:

 Citirea instrucțiunii
 Decodificarea instrucțiunii
 Aducerea operanzilor din regiștri
 Execuția instrucțiunii
 Scrierea înapoi în memorie sau într-un registru a rezultatului obținut

Majoritatea procesoarelor disponibile la ora actuală se folosesc de paralelizare la un nivel sau altul, iar în acest sens proiectanții de microprocesoare au creat diverse procedee si arhitecturi pentru a exploata conceptul de paralelizare și anume:
 Superscalarizarea
 Execuția speculativă
 Conceptul  VLIW (Very Long Instruction Word)
 Predicția salturilor (eng. Branch Prediction)

Superscalarizarea 

 Conceptul de superscalarizare se referă la procesoare superscalare, acestea folosindu-se de paralelism la nivel de arhitectură, și pot executa un număr mare de instrucțiuni într-un singur ciclu. Modul în care un procesor superscalar funcționează este prin implementarea mai multor unități logice de execuție pentru realizarea ciclului instrucțiune. În acest mod etapele pipeline se suprapun mărind viteza de execuție a unui număr mare de instrucțiuni.

Un procesor superscalar aduce din memorie mai multe instrucțiuni simultan, putând anticipa salturile condiționate și astfel să nu întâmpine întreruperi la nivel de flux de instrucțiuni. Acest lucru este posibil prin folosirea de memorie rapidă de mici dimensiuni, cunoscută sub denumirea de memorie cache, ce conține instrucțiunile executate cel mai recent, astfel reducându-se întârzierile cauzate de accesul la memoria principală (mult mai lentă în comparație cu memoria cache).

Execuția speculativă 

 Execuția speculativă este o tehnică de optimizare a execuției instrucțiunilor prin care se efectuează anumite operații înainte de a se ști sigur dacă acele instrucțiuni vor fi executate sau nu. Deși tehnica nu pare naturală, ideea acesteia este de a realiza anumite operații în avans astfel încât în momentul în care execuția unei instrucțiuni invocă acea operație, procesul de execuție să nu fie încetinit prin așteptarea acelei operații. Acestă tehnică este folosită și în cadrul predicției salturilor (eng. Branch Prediction). Arhitectura hardware implică existența unui procesor sau a unei unități logice aflate în stare de așteptare folosită pentru realizarea operațiilor mentionate, în avans. Acest lucru ameliorează costurile aferente metodei de predicție a salturilor.

Arhitectura de tip VLIW 

 VLIW (Very Long Instruction Word) este o arhitectură microprocesor ce execută un număr mic de operații simple la un moment dat. Denumirea arhitecturii acestui tip de microprocesor vine de la faptul că instrucțiunile ce vor fi executate sunt împachetate într-o instrucțiune largă. Caracteristicile unui procesor VLIW sunt:
 Un procesor VLIW are unități funcționale multiple și independente, ce îi permit execuția simultană a mai multor operații grupate într-un cuvânt de comandă
 Un procesor VLIW posedă o singură unitate de control, această unitate fiind responsabilă cu generarea unui cuvânt de comandă lung, prin care controlează unitățile logice prin câmpuri independente. Acest lucru implică faptul că la momentul execuției un singur flux de instrucțiuni se execută (un singur cuvânt de comandă) pe fiecare perioadă de ceas. 
 Spre deosebire de un procesor superscalar un procesor VLIW nu implementeaza fizic (la nivel de hardware) paralelizarea ci lasă compilatorul să optimizeze programul în așa manieră încât acesta să detecteze instrucțiunile și să le împacheteze într-o secvență foarte lungă, instrucțiuni pe care le va executa în mod distribuit si echilibrat pe unitățile funcționale incluse în arhitectura procesorului VLIW.

Predicția salturilor 

Acest concept cunoscut în Engleză ca Branch Prediction (predicția ramificațiilor), este o tehnică pipeline prin care se dorește optimizarea structurii pipeline prin evitarea reinițializării acesteia dacă în procesul de încărcare a instrucțiunilor program s-a produs o eroare.
Salturile sunt de două feluri:

 Salturi condiționate - încărcarea instrucțiunii se realizează doar după calcularea adresei la care se va face saltul, și trebuie evaluată condiția de salt
 Salturi necondiționate - cărora le trebuie calculată doar adresa la care se va realiza saltul

 Execuția instrucțiunilor unui program necesită cunoașterea adresei de salt și evaluarea condiției de salt, în lipsa acestor informații pipeline-ul poate aștepta sau încărca o instrucțiune de țintă posibilă, pentru ca în clipa în clipa în care cele două informații devin cunoscute (sunt calculate) să poată decide reinițializarea întreagii structuri. Reinițializarea pipeline-ului se realizează doar dacă instrucțiunile încărcate sunt eronate. În acest mod de funcționare performanța structurii pipeline scade, aici intervenind predicția salturilor, ajutând la atenuarea scăderii de performanță.

Instrucțiunile de salt pot fi categorisite în:

 Salturi statice - acestea se află în codul ce va fi executat și astfel sunt cunoscute înainte de execuția întregului program
 Salturi dinamice - acestea spre deosebire de salturile statice nu sunt cunoscute înainte de execuție deoarece apar în urma execuției

 Predicția salturilor se bazează pe păstrarea informațiilor despre fiecare salt, dacă a fost efectuat sau nu, și ce decizie a fost luată pentru saltul respectiv. Această monitorizare a salturilor se face prin intermediul unei memorii tampon (vezi memorie cache) numită BTB (eng. Branch Target Buffer), în care se păstrează informațiile privind adresele instrucțiunilor țintă pentru fiecare salt și informația necesară realizării fiecărei predicții.

Vezi și
Very Long Instruction Word

Instruction Level Parallelism

Out of order execution

Branch Prediction

Superscalar CPU architecture

Note

Implementarea paralelismului la nivel de instructiune în microprocesoarele superscalare Prof.dr.ing. Gheorghe Dodescu 

Out of order execution

Arhitecturi RISC de uniprocesare paralelă a datelor utilizând cuvinte de instrucțiuni foarte lungi tip VLIW 

Programare în limbaj de asamblare - Procesoare superscalare 

Microarhitectura Pentium

Arhitecturi Procesoare 

Predicția salturilor

Informatică
Paralelizarea la nivel de instrucțiune este denumirea dată unei suite de metode de proiectare ( atât hardware cât și software ) pentru majoritatea familiilor de procesoare si compilatoare în scopul măririi vitezei de execuție . Mărirea vitezei de execuție se face prin rularea în paralel a mai multor operații . Încă de la începutul anilor odată cu avântul sistemelor de calcul , și dezvoltării arhitecturilor de tip microprocesor a apărut o nevoie stringentă pentru a micșora timpul execuție al unui program , prin artificii de arhitectură hardware ( arhitecturi orientate către paralelizare ) și software ( la nivel de compilator ) . Datorită trecerii de la sisteme de calcul analogice la sisteme de calcul digitale a marilor companii în ce privește infrastructura IT costul asociat implementării unor funcționalități precum paralelismul la nivel de instrucțiune , paralelismul la nivel de memorie a fost justificat,deoarece prin implementarea acestor funcționalități au fost satisfăcute necesitățile companiilor respective la acel moment . Aceste funcționalități au fost apoi preluate în toate versiunile de microprocesoare , inclusiv cele lansate pe piață la ora actuală . Scopul paralelizării la nivel de instruțiune Interesul din spatele paralelizării la nivel de instrucțiune este mărirea vitezei de execuție a instrucțiunilor ce în totalitatea lor alcătuiesc un program . Metrica prin care se măsoară viteza de execuție se numește număr de cicli per instrucțiune ( eng . Cycles per Instruction ) . În mod obișnuit un microprocesor pe bază de pipeline -uri realizează o instrucțiune într- un ciclu mașină . Obținerea unei viteze mai mari la procesarea datelor înseamnă executarea unui număr mai mare de instrucțiuni într- un ciclu instrucțiune . Acest lucru se poate realiza prin două metode : Mărirea cantității de informații procesate prin fragmentarea etapelor pipeline Mărirea numărului de instrucțiuni per ciclu prin implementarea mai multor căi de acces la date Modul în care trebuie privit un pipeline este asemănător cu o linie de asamblare pentru autovehicule , procesul fiind secvențial . Un ciclu instrucțiune este alcătuit din cinci etape : Citirea instrucțiunii Decodificarea instrucțiunii Aducerea operanzilor din regiștri Execuția instrucțiunii Scrierea înapoi în memorie sau într- un registru a rezultatului obținut Majoritatea procesoarelor disponibile la ora actuală se folosesc de paralelizare la un nivel sau altul , iar în acest sens proiectanții de microprocesoare au creat diverse procedee si arhitecturi pentru a exploata conceptul de paralelizare și anume : Superscalarizarea Execuția speculativă Conceptul VLIW ( Very Long Instruction Word ) Predicția salturilor ( eng. Branch Prediction ) Superscalarizarea Conceptul de superscalarizare se referă la procesoare superscalare , acestea folosindu -se de paralelism la nivel de arhitectură , și pot executa un număr mare de instrucțiuni într- un singur ciclu . Modul în care un procesor superscalar funcționează este prin implementarea mai multor unități logice de execuție pentru realizarea ciclului instrucțiune . În acest mod etapele pipeline se suprapun mărind viteza de execuție a unui număr mare de instrucțiuni . Un procesor superscalar aduce din memorie mai multe instrucțiuni simultan , putând anticipa salturile condiționate și astfel să nu întâmpine întreruperi la nivel de flux de instrucțiuni . Acest lucru este posibil prin folosirea de memorie rapidă de mici dimensiuni , cunoscută sub denumirea de memorie cache , ce conține instrucțiunile executate cel mai recent , astfel reducându -se întârzierile cauzate de accesul la memoria principală ( mult mai lentă în comparație cu memoria cache ) . Execuția speculativă Execuția speculativă este o tehnică de optimizare a execuției instrucțiunilor prin care se efectuează anumite operații înainte de a se ști sigur dacă acele instrucțiuni vor fi executate sau nu . Deși tehnica nu pare naturală , ideea acesteia este de a realiza anumite operații în avans astfel încât în momentul în care execuția unei instrucțiuni invocă acea operație , procesul de execuție să nu fie încetinit prin așteptarea acelei operații . Acestă tehnică este folosită și în cadrul predicției salturilor ( eng. Branch Prediction ) . Arhitectura hardware implică existența unui procesor sau a unei unități logice aflate în stare de așteptare folosită pentru realizarea operațiilor mentionate , în avans . Acest lucru ameliorează costurile aferente metodei de predicție a salturilor . Arhitectura de tip VLIW VLIW ( Very Long Instruction Word ) este o arhitectură microprocesor ce execută un număr mic de operații simple la un moment dat . Denumirea arhitecturii acestui tip de microprocesor vine de la faptul că instrucțiunile ce vor fi executate sunt împachetate într- o instrucțiune largă . Caracteristicile unui procesor VLIW sunt : Un procesor VLIW are unități funcționale multiple și independente , ce îi permit execuția simultană a mai multor operații grupate într- un cuvânt de comandă Un procesor VLIW posedă o singură unitate de control , această unitate fiind responsabilă cu generarea unui cuvânt de comandă lung , prin care controlează unitățile logice prin câmpuri independente . Acest lucru implică faptul că la momentul execuției un singur flux de instrucțiuni se execută ( un singur cuvânt de comandă ) pe fiecare perioadă de ceas . Spre deosebire de un procesor superscalar un procesor VLIW nu implementeaza fizic ( la nivel de hardware ) paralelizarea ci lasă compilatorul să optimizeze programul în așa manieră încât acesta să detecteze instrucțiunile și să le împacheteze într- o secvență foarte lungă , instrucțiuni pe care le va executa în mod distribuit si echilibrat pe unitățile funcționale incluse în arhitectura procesorului VLIW . Predicția salturilor Acest concept cunoscut în Engleză ca Branch Prediction ( predicția ramificațiilor ) , este o tehnică pipeline prin care se dorește optimizarea structurii pipeline prin evitarea reinițializării acesteia dacă în procesul de încărcare a instrucțiunilor program s- a produs o eroare . Salturile sunt de două feluri : Salturi condiționate - încărcarea instrucțiunii se realizează doar după calcularea adresei la care se va face saltul , și trebuie evaluată condiția de salt Salturi necondiționate - cărora le trebuie calculată doar adresa la care se va realiza saltul Execuția instrucțiunilor unui program necesită cunoașterea adresei de salt și evaluarea condiției de salt , în lipsa acestor informații pipeline -ul poate aștepta sau încărca o instrucțiune de țintă posibilă , pentru ca în clipa în clipa în care cele două informații devin cunoscute ( sunt calculate ) să poată decide reinițializarea întreagii structuri . Reinițializarea pipeline -ului se realizează doar dacă instrucțiunile încărcate sunt eronate . În acest mod de funcționare performanța structurii pipeline scade , aici intervenind predicția salturilor , ajutând la atenuarea scăderii de performanță . Instrucțiunile de salt pot fi categorisite în : Salturi statice - acestea se află în codul ce va fi executat și astfel sunt cunoscute înainte de execuția întregului program Salturi dinamice - acestea spre deosebire de salturile statice nu sunt cunoscute înainte de execuție deoarece apar în urma execuției Predicția salturilor se bazează pe păstrarea informațiilor despre fiecare salt , dacă a fost efectuat sau nu , și ce decizie a fost luată pentru saltul respectiv . Această monitorizare a salturilor se face prin intermediul unei memorii tampon ( vezi memorie cache ) numită BTB ( eng. Branch Target Buffer ) , în care se păstrează informațiile privind adresele instrucțiunilor țintă pentru fiecare salt și informația necesară realizării fiecărei predicții . Vezi și Very Long Instruction Word Instruction Level Parallelism Out of order execution Branch Prediction Superscalar CPU architecture Note Implementarea paralelismului la nivel de instructiune în microprocesoarele superscalare Prof.dr.ing . Gheorghe Dodescu Out of order execution Arhitecturi RISC de uniprocesare paralelă a datelor utilizând cuvinte de instrucțiuni foarte lungi tip VLIW Programare în limbaj de asamblare - Procesoare superscalare Microarhitectura Pentium Arhitecturi Procesoare Predicția salturilor Informatică