Execuție multi-thread pe CPU: Cum funcționează în performanță

Când vorbim procesoare pentru PC-uri , este foarte frecvent să vorbim despre numărul de nuclee și firele de procesare sau de execuție, care sunt în general dublu față de numărul de nuclee deoarece HyperThreading tehnologii în cazul Intel și SMT în caz of AMD ceea ce fac este că fiecare nucleu poate executa două sarcini simultane. Cu toate acestea, acesta este un mod oarecum simplu de a explica cum lucrări multithreading pe un procesor și în acest articol ceea ce vom face este să vă explicăm mai detaliat, astfel încât să puteți înțelege toate intrările și ieșirile sale.

Acestea fiind spuse, știm cu toții că un procesor care are mai multe fire de execuție decât nuclee este capabil să ruleze mai multe sarcini simultan și, de fapt, sistemul de operare detectează procesorul de parcă ar avea de fapt atâtea nuclee câte fire de execuție. De exemplu, un Intel Core i7-8700K are 6 nuclee și 12 fire datorită tehnologiei HyperThreading și ferestre din 10 îl recunoaște ca un procesor cu 12 nuclee așa cum este (deși este adevărat că le numește „procesoare logice”), deoarece pentru sistemul de operare, funcționarea sa este complet transparentă.

Execuție multi-thread pe CPU

Ce este procesarea multi-thread?

În arhitectura computerului, procesarea multi-thread este capacitatea unității centrale de procesare (Procesor) pentru a furniza mai multe fire de execuție în același timp, acceptate de sistemul de operare. Această abordare diferă de multiprocesare și nu trebuie confundată; Într-o aplicație cu mai multe fire, firele partajează resursele unuia sau mai multor nuclee de procesor, inclusiv unități de calcul, cache și tampon de căutare de traducere (TLBL).

Multiproceso vs multi hilo

Atunci când sistemele multiprocesare includ mai multe unități de procesare complete pe unul sau mai multe nuclee, multiprocesarea are ca scop creșterea utilizării unui singur nucleu utilizând paralelism la nivel de fir, precum și paralelism la nivel de instrucțiuni. Deoarece cele două tehnici sunt complementare, ele sunt combinate în aproape toate arhitecturile de sistem moderne cu procesoare multiple cu mai multe fire și cu procesoare multi-core capabile să funcționeze cu mai multe fire.

Paradigma multi-threaded a devenit mai populară pe măsură ce eforturile de exploatare a paralelismului la nivel de instrucțiuni (adică a putea executa instrucțiuni multiple în paralel) s-au oprit la sfârșitul anilor '1990. Acest lucru a permis ca conceptul de calcul al performanței să iasă din domeniul mai specializat al procesării tranzacțiilor.

Deși este foarte dificil să accelerați în continuare un singur fir sau program, majoritatea sistemelor informatice sunt de fapt multitasking între mai multe fire sau programe și, prin urmare, tehnicile care îmbunătățesc performanța tuturor sarcinilor duc la creșteri de performanță. general. Cu alte cuvinte, cu cât un procesor poate procesa mai multe instrucțiuni în același timp, cu atât este mai bună performanța generală a întregului sistem.

Chiar și procesarea multi-thread are dezavantaje

În plus față de câștigurile de performanță, unul dintre avantajele procesării cu mai multe fire este că, dacă un fir are multe erori de cache, celelalte fire pot profita în continuare de resursele CPU neutilizate, ceea ce poate duce la o execuție generală mai rapidă. deoarece aceste resurse ar fi fost inactive dacă s-ar fi executat un singur fir. De asemenea, dacă un fir nu poate utiliza toate resursele procesorului (de exemplu, deoarece instrucțiunile depind de rezultatul celui precedent), rularea unui alt fir poate împiedica aceste resurse să rămână inactiv.

CPU Reverso Render

Totuși, totul are și latura sa negativă. Mai multe fire se pot interfera unele cu altele prin partajarea resurselor hardware, cum ar fi memoria cache sau tampoanele de căutare a traducerilor. Ca rezultat, timpii de execuție cu un singur fir nu se îmbunătățesc și se pot degrada, chiar și atunci când se execută un singur fir, din cauza frecvențelor mai mici sau a etapelor suplimentare ale conductei care sunt necesare pentru a găzdui hardware-ul de comutare a procesului.

Eficiența generală variază; Intel spune că tehnologia HyperThreading îl îmbunătățește cu 30%, în timp ce un program sintetic care efectuează doar un ciclu de operații în virgulă mobilă dependente neoptimizate primește de fapt o îmbunătățire de 100% atunci când este rulat în paralel. Pe de altă parte, programele de limbaj de asamblare reglate manual care utilizează extensii MMX sau AltiVec și caută în prealabil date (cum ar fi un codificator video) nu suferă de scurgeri de cache sau resurse inactive, deci nu beneficiază deloc de o rulare . multi-threaded și poate vedea de fapt performanța lor degradată din cauza conflictului asupra acțiunilor.

Din punct de vedere al software-ului, suportul hardware multi-thread este complet vizibil, necesitând modificări suplimentare atât la programele de aplicații, cât și la sistemul de operare în sine. Tehnicile hardware utilizate pentru a sprijini procesarea multithread sunt adesea paralele cu tehnicile software utilizate pentru multitasking; Programarea filetării este, de asemenea, o problemă majoră în multithreading.

Tipuri de procesare multi-thread

Așa cum am spus la început, cu toții avem concepția că procesarea multi-thread este pur și simplu paralelizarea proceselor (adică executarea mai multor sarcini în același timp), dar în realitate lucrurile sunt puțin mai complicate decât atât și există diferite tipuri procesare multi-thread.

Mai multe fire „cu granulație grosieră”

Cel mai bun-procesoare CPU-pentru-streaming

Cel mai simplu tip de multi-threading apare atunci când un thread rulează până când este blocat de un eveniment care ar crea în mod normal o blocare de latență lungă. Un astfel de crash ar putea fi o lipsă de cache care trebuie să acceseze memoria off-chip, care poate dura sute de cicluri CPU pentru ca datele să revină. În loc să aștepte rezolvarea blocării, procesorul va comuta execuția pe un alt thread care era deja gata de rulare și numai când au sosit datele din thread-ul anterior, acesta va fi introdus din nou în lista de fire gata de rulat.

Conceptual, acest lucru este similar cu multitaskingul cooperativ utilizat în sistemele de operare în timp real, în care sarcinile renunță voluntar la timpul de rulare al procesorului atunci când trebuie să aștepte să se întâmple un fel de eveniment. Acest tip de filetare multiplă este cunoscut sub numele de „bloc” sau „cu granulație grosieră”.

Multithread intercalat

Scopul acestui tip de procesare multi-thread este de a elimina toate blocările de dependență de date din conducta de execuție. Deoarece un fir este relativ independent de altele, există mai puține șanse ca o instrucțiune într-o etapă de conductă să aibă nevoie de o ieșire dintr-o instrucțiune anterioară în același canal; Conceptual, acest lucru este similar cu multitaskingul preventiv utilizat în sistemul de operare și o analogie ar fi că intervalul de timp acordat fiecărui fir activ este de un ciclu CPU.

Ejecuție multi hilo

Desigur, acest tip de procesare multi-thread are un dezavantaj principal și anume faptul că fiecare etapă a conductei trebuie să urmărească ID-ul thread-ului instrucțiunii pe care o procesează, ceea ce îi încetinește performanța. De asemenea, deoarece există mai multe fire care rulează în același timp în conductă, partajările, cum ar fi memoria cache, trebuie să fie mai mari pentru a evita erorile.

Multithreading paralel

Cel mai avansat tip de multithreading se aplică procesoarelor cunoscute sub numele de superscalare. În timp ce un procesor tipic suprascalar emite mai multe instrucțiuni dintr-un singur fir pe fiecare ciclu CPU, în procesarea simultană cu mai multe fire (SMT), un procesor suprascalar poate emite instrucțiuni din mai multe fire pe fiecare ciclu. Recunoscând că orice fir are o cantitate limitată de paralelism la nivel de instrucțiuni, aceste multithreaduri încearcă să exploateze paralelismul disponibil pe mai multe fire pentru a reduce deșeurile asociate cu spațiile neutilizate.

Pentru a distinge celelalte tipuri de procesare SMT cu mai multe fire, termenul „temporar cu mai multe fire” este adesea folosit pentru a indica când instrucțiunile cu un singur fir pot fi emise în același timp. Implementările de acest tip includ DEC, EV8, tehnologia Intel HyperThreading, IBM Power5, Sun Mycrosystems UltraSPARC T2, Cray XMT și microarhitecturile AMD Bulldozer și Zen.