K8

AMD K8
CPU
Productie din 2003 până în 2014
Producător
frecvența procesorului 1,6-3,2  GHz
Frecvența FSB 800-1000  MHz
Tehnologia de producție 130-65  nm
Seturi de instrucțiuni AMD64 (x86-64)
conector
Nuclei
AMD K7AMD K10

K8 este o  microarhitectură CPU compatibilă cu x86 dezvoltată de AMD Corporation . Introdus pentru prima dată pe 22 aprilie 2003: primele procesoare Opteron au fost lansate pentru piața serverelor. Pe baza acestei microarhitecturi au fost produse familiile de microprocesoare Opteron, Athlon 64 , Athlon 64 X2 , Turion 64 . Este o versiune radical reproiectată, îmbunătățită semnificativ și extinsă a microarhitecturii AMD K7 din generația anterioară . Noile procesoare au reușit să depășească o serie de probleme care au fost călcâiul lui Ahile al lui K7 și au introdus, de asemenea, o serie de soluții fundamental noi.

Puncte principale

Microprocesoarele K8 sunt procesoare de execuție superscalare , multi-pipeline, predictive și speculative. La fel ca procesoarele AMD K7 și Intel P6, acestea sunt teoretic capabile să execute până la 3 instrucțiuni pe ceas. Ca orice procesor x86 modern, K8 recodifică mai întâi setul extern complex CISC de instrucțiuni x86 în micro-opțiuni interne, asemănătoare RISC , care, la rândul lor, sunt deja în curs de executare. Pentru îmbunătățirea performanței în cadrul microarhitecturii, se implementează execuția speculativă cu predicție de ramuri și lansarea de micro-operațiuni Out-of-Order ; pentru a reduce impactul dependențelor de date, sunt utilizate tehnici de redenumire a registrelor , redirecționarea rezultatelor și o serie de altele.

Transportor K8

Microarhitectura K8 folosește o conductă cu 12 etape, o parte semnificativă din care se află în decodorul de instrucțiuni.

Preluarea și decodarea instrucțiunilor

Principala problemă cu decodificarea instrucțiunilor x86 este că au lungimi diferite (de la 1 la 15 octeți). În K8, această problemă este rezolvată prin separarea procesului de etichetare a fluxului de instrucțiuni și decodarea efectivă în două subsarcini separate executate în unități de procesor diferite. Faptul este că, înainte de a fi plasați în memoria cache de prim nivel pentru instrucțiuni (L1I) , acestea trec prin procedura de pre-decodare cu o rată de 4 octeți de instrucțiuni pe ceas. Și informațiile de marcare sunt plasate într-o serie specială de etichete asociate cu L1. Acest lucru simplifică și mai mult, decodificarea de lucru și reduce conducta. Această soluție este unică deoarece alte procesoare x86 (cu excepția K7) folosesc tehnici diferite pentru a rezolva această problemă. Deci, la procesoarele Intel P6, marcarea se realizează din mers, în timp ce în Intel NetBurst instrucțiunile sunt decodificate înainte de a fi stocate în L1 (în locul cache-ului standard de instrucțiuni, se folosește o structură specială, destul de complexă, care stochează micro-operațiunile deja decodate. - cache-ul de urme).

K8 are un cache asociat cu set dublu canal cu o sarcină utilă de 64 KB și o linie de 64 de octeți. Cu toate acestea, pe lângă instrucțiunile în sine, procesorul stochează și o serie de etichete de marcare - 3 biți pe octet L1, adică aproximativ 21 KB, precum și descriptori de predictor de ramuri - aproximativ 8 KB.

Din L1 , instrucțiunile sunt preluate imediat în blocuri de 16 octeți, care sunt trimise simultan, printr-un buffer special ( fetch -buffer), către conducta de execuție și către blocul predictor de ramificație. În predictorul de ramificație, blocul de instrucțiuni este analizat utilizând un buffer special de adresă de ramificație ( BTB ) de 2048 de intrări și tabele istorice de ramificație asociate (BHT) cu o capacitate totală de 16K intrări, precum și unele dispozitive auxiliare. Dacă blocul de instrucțiuni conținea un salt, atunci blocul următor va fi preluat de la adresa prezisă. Din păcate, predictorul de ramificație  este un dispozitiv prea complex pentru a rula în ritmul complet al procesorului, astfel încât toate predicțiile sunt efectuate cu o latență de 2 cicluri, adică dacă procesorul întâmpină o tranziție, atunci următoarea preluare de la L1 va fi executat numai după un ciclu. În cele mai multe cazuri, această întârziere este compensată de faptul că există multe instrucțiuni într-un bloc de 16 octeți, iar rata generală de preluare este lider.

Din memoria tampon de preluare , instrucțiunile merg la decodor. Fiecare instrucțiune x86 K8 aparține uneia dintre cele trei clase:

DirectPath și DirectPathDouble sunt considerate simple, în timp ce VectorPath  este considerat complex. De fapt, K8 are 2 blocuri de decodor diferite care funcționează în paralel și se completează reciproc. Blocul principal este un complex de trei decodoare simple care lucrează împreună și decodifică până la trei instrucțiuni DirectPath - și DirectPathDouble - per ceas, în orice combinație. Al doilea bloc se ocupă exclusiv de instrucțiuni VectorPath și decodifică o astfel de instrucțiune pe ciclu. Când rulează un decodor VectorPath , etapele corespunzătoare ale decodorelor simple sunt dezactivate. Astfel, decodorul K8 poate fi considerat un dispozitiv destul de eficient și productiv care poate recoda până la trei instrucțiuni simple sau una complexă pe ceas. Ca rezultat al decodării, MOP-urile sunt reambalate prin tampoane intermediare în grupuri speciale de trei MOP-uri per grup (linii). MOP-urile din grup urmează strict în ordinea codului original al programului , nu se efectuează nicio permutare. MOP -urile instrucțiunilor DirectPath- și DirectPathDouble- pot fi amestecate în orice fel (cu excepția instrucțiunii de multiplicare, care este decodificată în 2 MOP-uri și se încadrează întotdeauna într-o singură linie), MOP-urile unei instrucțiuni DirectPathDouble pot fi chiar localizate în linii diferite, dar toate MOP-urile VectorPath- instrucțiunile trebuie să urmeze într-un număr întreg de grupuri și nu pot fi amestecate cu MOP-urile din instrucțiuni simple, ceea ce duce la o oarecare fragmentare și completarea incompletă a grupurilor, dar, totuși, nu este o situație frecventă, deoarece marea majoritate a instrucțiunilor în K8 sunt simple.

Executarea și demisia

O caracteristică interesantă a lui K8 este că procesorul din interiorul său funcționează în grupuri de 3 MOP-uri, ceea ce poate reduce semnificativ cantitatea de logica de control a procesorului. În procesoarele Intel, deși MOP-urile merg în grupuri în unele etape ale conductei , fiecare MOP este încă urmărit separat. O altă mare diferență între procesoarele K8 și Intel este că se îndepărtează de principiul simplificării maxime a micro-ops. Faptul este că sistemul de comandă x86 CISC conține un număr mare de instrucțiuni precum Load-Op (încărcare + execuție) și Load-Op-Store (încărcare + execuție + descărcare). Deoarece toate procesoarele x86 moderne sunt RISC, astfel de instrucțiuni din interiorul procesorului sunt împărțite într-un număr mare de MOP-uri, fiecare dintre ele efectuând o acțiune simplă proprie. Deci, o instrucțiune de tip add eax, mem;va fi descompusă în cel puțin 2 MOP-uri - încărcarea din memorie și adăugarea în sine, adică numărul de MOP-uri care trebuie executate poate depăși semnificativ numărul de instrucțiuni x86 originale, acestea vor umple căile interne și tampoanele procesorului, nepermițând atingerea unei viteze de 3 operații pe ciclu.

În procesoarele cu microarhitectură K7 și K8, dezvoltatorii au decis să rezolve această problemă făcând MOS cu două componente. Fiecare MOP din aceste procesoare constă din două instrucțiuni elementare: o microinstrucțiune de aritmetică cu numere întregi sau în virgulă mobilă + o microinstrucțiune de aritmetică de adrese . Astfel, instrucțiuni precum Load-Op și Load-Op-Store pot fi decodificate în K8 într-un singur MOS, ceea ce economisește resursele procesorului și, în consecință, îi îmbunătățește eficiența.

Dacă este necesar, una dintre componentele MOP nu poate fi utilizată și va fi completată cu un gol. Astfel, o instrucțiune de tip Load va fi recodificată într-un singur MOP care conține doar componenta de adresă. Trebuie spus că în noile procesoare Intel, pentru o serie de instrucțiuni Load-Op , este utilizat și un mecanism similar de îmbinare a micro-operațiilor într-un singur MOP cu diviziunea sa ulterioară înainte de a începe MOP-ul pentru execuție, care se numește microfuziune. .

Un grup de trei MOSFET-uri cu două componente iese din decodor și este controlat în continuare de procesor în ansamblu folosind o unitate specială - ICU . Grupurile MOP trec prin etapele de redenumire a registrului și alocarea resurselor, apoi plasate în ROB . În ROB, grupurile de instrucțiuni sunt stocate până în momentul demisiei, demisia instrucțiunilor este efectuată imediat de către întregul grup, când sunt executate toate MOP-urile din grup și numai în ordinea de prioritate specificată de programul sursă. Capacitatea ROB a lui K8 este de 24 de grupuri, ceea ce corespunde la 72 MOP-uri sau 144 micro-op-uri. Procesorul K8 folosește o schemă statică pentru distribuirea instrucțiunilor între unitățile de execuție, adică în ce grup de FU [ termen necunoscut ] MOS va fi lansat depinde direct de poziția acestui MOS în grup. În total, procesorul are trei programatoare de instrucțiuni pentru aritmetica întregi și adrese în funcție de numărul de MOP-uri dintr-un grup.

Din ROB -uri , instrucțiunile sunt copiate în tampoanele programatorului. Procesorul are trei cozi de planificare pentru operațiuni Int și trei pentru operațiuni cu adrese, fiecare cu o capacitate de 8 micro-ops. În cazul general, instrucțiunile din fiecare coadă pot fi lansate pentru execuție în FU independent unele de altele și folosind Out-Of-Order. Adică, instrucțiunile sunt trimise către FU în ordinea în care are nevoie procesorul. Procesorul conține trei ALU -uri pe 64 de biți și trei AGU -uri , fiecare conectat în perechi la propriul său planificator.

Dispunerea și execuția MOP-urilor de aritmetică plutitoare se realizează într-un dispozitiv special separat. Pentru execuția lor, procesorul conține un dispozitiv FMUL , un FADD și un FMISC, care este auxiliar.

Link -uri