Multithreading (arhitectura calculatoarelor)

Multithreading intercalat/temporalEdit

Articolul principal: Multithreading temporal

Multithreading cu granulație grosierăEdit

Cel mai simplu tip de multithreading are loc atunci când un fir rulează până când este blocat de un eveniment care în mod normal ar crea un blocaj cu latență lungă. Un astfel de blocaj ar putea fi o ratare a cache-ului care trebuie să acceseze memoria în afara cipului, ceea ce ar putea dura sute de cicluri CPU pentru ca datele să se întoarcă. În loc să aștepte ca blocajul să se rezolve, un procesor cu fire de execuție ar comuta execuția către un alt fir de execuție care este gata să funcționeze. Numai după ce datele pentru firul anterior ar fi sosit, firul anterior ar fi plasat din nou pe lista firelor gata de execuție.

De exemplu:

  1. Ciclul i: este emisă instrucțiunea j din firul A.
  2. Ciclul i + 1: este emisă instrucțiunea j + 1 din firul A.
  3. Ciclul i + 2: este emisă instrucțiunea j + 2 din firul A, care este o instrucțiune de încărcare care ratează în toate ancorele.
  4. Ciclul i + 3: planificatorul de fire invocat, trece la firul B.
  5. Ciclul i + 4: este emisă instrucțiunea k de la firul B.
  6. Ciclul i + 5: este emisă instrucțiunea k + 1 de la firul B.

Conceptual, este similar cu multitaskingul cooperativ utilizat în sistemele de operare în timp real, în care sarcinile renunță în mod voluntar la timpul de execuție atunci când trebuie să aștepte un anumit tip de eveniment. Acest tip de multithreading este cunoscut sub numele de block, cooperative sau coarse-grained multithreading.

Obiectivul suportului hardware pentru multithreading este de a permite comutarea rapidă între un fir blocat și un alt fir gata de execuție. Pentru a atinge acest obiectiv, costul hardware constă în replicarea registrelor vizibile ale programului, precum și a unor registre de control ale procesorului (cum ar fi contorul de program). Comutarea de la un fir la un alt fir înseamnă că hardware-ul trece de la utilizarea unui set de registre la altul; pentru a comuta eficient între firele active, fiecare fir activ trebuie să aibă propriul set de registre. De exemplu, pentru a comuta rapid între două fire de execuție, hardware-ul de registre trebuie să fie instanțiat de două ori.

Suportul hardware suplimentar pentru multithreading permite comutarea firelor de execuție să se facă într-un singur ciclu al procesorului, aducând îmbunătățiri de performanță. De asemenea, hardware-ul suplimentar permite ca fiecare fir să se comporte ca și cum s-ar executa singur și nu ar împărți nicio resursă hardware cu alte fire, minimizând cantitatea de modificări software necesare în cadrul aplicației și al sistemului de operare pentru a suporta multithreading.

Multe familii de microcontrolere și procesoare încorporate au mai multe bănci de registre pentru a permite comutarea rapidă a contextului pentru întreruperi. Astfel de scheme pot fi considerate un tip de multithreading în bloc între firul programului utilizator și firele de întrerupere.

Multithreading intercalatEdit

Articolul principal: Procesorul cu butoi

Scopul interleaved multithreading este de a elimina toate blocajele legate de dependența de date din conducta de execuție. Având în vedere că un fir este relativ independent de alte fire, există mai puține șanse ca o instrucțiune dintr-o etapă de pipeleining să aibă nevoie de o ieșire de la o instrucțiune mai veche din pipeline. Din punct de vedere conceptual, este similar cu multitasking-ul preemptiv utilizat în sistemele de operare; o analogie ar fi aceea că intervalul de timp acordat fiecărui fir activ este de un ciclu al procesorului.

De exemplu:

  1. Ciclul i + 1: este emisă o instrucțiune din firul B.
  2. Ciclul i + 2: este emisă o instrucțiune de la firul C.

Acest tip de multithreading a fost numit la început procesare în butoi, în care doagele unui butoi reprezintă etapele pipeline și firele de execuție ale acestora. Interleaved, preemptive, fine-grained sau time-sliced multithreading sunt terminologii mai moderne.

În plus față de costurile hardware discutate în cazul tipului de multithreading de tip bloc, multithreading-ul interleaved are un cost suplimentar de urmărire de către fiecare stadiu al pipeline-ului a ID-ului de thread al instrucțiunii pe care o procesează. De asemenea, din moment ce există mai multe fire care sunt executate concomitent în pipeline, resursele partajate, cum ar fi cache-urile și TLB-urile, trebuie să fie mai mari pentru a evita thrashing-ul între diferitele fire.

Multithreading simultanEdit

Articolul principal: Simultaneous multithreading

Cel mai avansat tip de multithreading se aplică procesoarelor superscalare. În timp ce un procesor superscalar normal emite mai multe instrucțiuni dintr-un singur fir de execuție la fiecare ciclu de procesare, în cazul multithreading-ului simultan (SMT) un procesor superscalar poate emite instrucțiuni din mai multe fire de execuție la fiecare ciclu de procesare. Recunoscând că orice fir unic are o cantitate limitată de paralelism la nivel de instrucțiuni, acest tip de multithreading încearcă să exploateze paralelismul disponibil în mai multe fire pentru a diminua risipa asociată cu sloturile de emitere neutilizate.

De exemplu:

  1. Ciclul i: instrucțiunile j și j + 1 din firul A și instrucțiunea k din firul B sunt emise simultan.
  2. Ciclul i + 1: instrucțiunea j + 2 din firul A, instrucțiunea k + 1 din firul B și instrucțiunea m din firul C sunt emise simultan.
  3. Ciclul i + 2: instrucțiunea j + 3 din firul A și instrucțiunile m + 1 și m + 2 din firul C sunt toate emise simultan.

Pentru a distinge celelalte tipuri de multithreading de SMT, termenul „multithreading temporal” este utilizat pentru a desemna situația în care instrucțiunile dintr-un singur fir pot fi emise la un moment dat.

În plus față de costurile hardware discutate pentru multithreading intercalat, SMT are costul suplimentar al fiecărei etape de pipeline care urmărește ID-ul firului de execuție al fiecărei instrucțiuni care este procesată. Din nou, resursele partajate, cum ar fi cache-urile și TLB-urile, trebuie să fie dimensionate pentru numărul mare de fire de execuție active care sunt procesate.

Implementarea include DEC (ulterior Compaq) EV8 (nefinalizat), Intel Hyper-Threading Technology, IBM POWER5, Sun Microsystems UltraSPARC T2, Cray XMT și microarhitecturile AMD Bulldozer și Zen.

.