Mes visi galvojame apie procesorių kaip apie kompiuterio „smegenis“, bet ką tai iš tikrųjų reiškia? Kas vyksta su milijardais tranzistorių, kad jūsų kompiuteris veiktų? Šioje naujoje keturių dalių mini serijoje daugiausia dėmesio skirsime kompiuterio aparatinės įrangos projektavimui, kuris apima kompiuterio paleidimo įvestis ir išvestis.

Ši serija apims kompiuterio architektūrą, procesoriaus grandinės dizainą, VLSI (labai didelio masto integraciją), lustų gamybą ir ateities skaičiavimo tendencijas. Jei visada domėjotės detalėmis, kaip procesoriai veikia viduje, pradėkite, nes tai, ką norite žinoti, kad pradėtumėte.

Mes pradėsime nuo labai aukšto lygio nuo to, ką veikia procesorius ir kaip statybiniai elementai dera kartu su veikiančiu dizainu. Tai apima procesoriaus šerdis, atminties hierarchiją, šakos numatymą ir kt. Pirma, mums reikia pagrindinio procesoriaus apibrėžimo. Paprasčiausias paaiškinimas yra tai, kad procesorius vadovaujasi instrukcijų rinkiniu, kad veiktų su įvesties rinkiniu. Pvz., Tai gali būti vertės nuskaitymas iš atminties, tada jos pridėjimas prie kitos vertės ir galiausiai rezultatų išsaugojimas kitoje vietoje. Tai taip pat gali būti kažkas sudėtingesnio, pavyzdžiui, padalinti du skaičius, jei ankstesnio skaičiavimo rezultatas yra didesnis nei nulis.

Kai norite paleisti tokią programą kaip operacinė sistema ar žaidimas, pati programa yra instrukcijų rinkinys, kurį turi vykdyti procesorius. Šios instrukcijos įkeliamos iš atminties į paprastą procesorių ir vykdomos po vieną, kol programa bus baigta. Nors programinės įrangos kūrėjai rašo savo programas aukšto lygio kalbomis, tokiomis kaip C ++ ar Python, procesorius to negali suprasti. Jis supranta tik 1 ir 0, todėl mums reikia būdo, kaip pavaizduoti kodą šiuo formatu.




Programos sudaromos į žemo lygio instrukcijas. surinkimo kalba Kaip dalis instrukcijų rinkinio architektūros (ISA). Tai yra instrukcijų rinkinys, kurį suprojektuotas ir vykdomas procesorius. Kai kurie iš labiausiai paplitusių ISA yra x86, MIPS, ARM, RISC-V ir PowerPC. Kaip funkcijos C ++ rašymo sintaksė skiriasi nuo funkcijos, kuri tą patį daro „Python“, kiekviena ISA turi skirtingą sintaksę.




Šiuos ISA galima suskirstyti į dvi pagrindines kategorijas: fiksuoto ilgio ir kintamo ilgio. RISC-V ISA naudoja fiksuoto ilgio instrukcijas, o tai reiškia, kad ji nustato, koks komandos tipas yra tam tikras skaičius iš anksto nustatytų kiekvienos komandos bitų. Tai skiriasi nuo x86, naudojant kintamo ilgio instrukcijas. „X86“ versijoje instrukcijas galima koduoti skirtingais būdais ir skirtingais dalimis skirtingu bitų skaičiumi. Dėl šio sudėtingumo x86 procesorių komandų dekoderis paprastai yra sudėtingiausia viso dizaino dalis.

Fiksuoto ilgio instrukcijos leidžia lengviau dekoduoti dėl jų įprasto pobūdžio, tačiau apriboja bendrą instrukcijų, kurias gali palaikyti ISA, skaičių. Įprastose RISC-V architektūros versijose yra apie 100 direktyvų, ir nors ji yra atviro kodo, ji yra x86 nuosavybė ir niekas nežino, kiek yra direktyvų. Žmonės paprastai tiki, kad yra keli tūkstančiai x86 instrukcijų, tačiau tikslus skaičius nėra viešai prieinamas. Nepaisant ISA skirtumų, visi jie iš esmės turi tą patį pagrindinį funkcionalumą.







Dabar esame pasirengę įjungti kompiuterį ir ką nors paleisti. Komandos vykdymas iš tikrųjų turi keletą pagrindinių dalių, kurios suskaidomos iš daugelio procesoriaus etapų.




Pirmas žingsnis - perkelti instrukciją iš atminties į procesorių, kad būtų paleista. Antrajame etape komanda dekoduojama, kad procesorius suprastų, kokia tai instrukcija. Yra daugybė tipų, tokių kaip aritmetinės komandos, šakojimo instrukcijos ir atminties instrukcijos. Kai procesorius sužino, kokias instrukcijas jis vykdo, instrukcijos operandai surenkami iš atminties ar vidinių procesoriaus registrų. Jei norite pridėti skaičių A prie B skaičiaus, negalėsite pridėti nežinodami A ir B reikšmių. Dauguma šiuolaikinių procesorių yra 64 bitai, o tai reiškia, kad kiekvienos duomenų vertės dydis yra 64 bitai.




Po to, kai centrinis procesorius turi operandus nurodymui, jis pereina į vykdymo etapą, kuriame apdorojamas įvestis. Tai gali būti skaičių pridėjimas, logiška manipuliacija skaičiais arba tiesiog numerių perdavimas nepakitęs. Apskaičiavus rezultatą, gali reikėti pasiekti atmintį, kad būtų išsaugoti rezultatai, arba procesorius gali laikyti vertę viename iš savo vidinių registrų. Išsaugojus rezultatą, procesorius atnaujins įvairių elementų būseną ir pereis prie kitos instrukcijos.

Šis paaiškinimas, žinoma, yra didelis supaprastinimas, ir dauguma šiuolaikinių procesorių, norėdami padidinti efektyvumą, šiuos kelis etapus padalija į 20 ar mažiau etapų. Tai reiškia, kad nors procesorius paleidžia ir baigia kelias instrukcijas kiekviename cikle, bet kuriai instrukcijai gali prireikti 20 ar daugiau ciklų, kad būtų užbaigta nuo pradžios iki pabaigos. Šis modelis dažnai vadinamas dujotiekiu, nes dujotiekiui užpildyti reikia šiek tiek laiko, o skystis praeis visiškai, tačiau užpildžius gausite pastovų išėjimą.

Visas ciklas, kurį eina instrukcija, yra labai griežtas choreografuotas procesas, tačiau ne visos instrukcijos gali baigtis tuo pačiu metu. Pavyzdžiui, įterpimas gali būti labai greitas, o padalijimas ar įkėlimas iš atminties gali užtrukti šimtus ciklų. Užuot sustabdžius visą procesorių, kai baigiama lėta instrukcija, daugumai šiuolaikinių procesorių trūksta tvarkos. Tai reiškia, kad jie nustatys, kurią komandą bus naudingiausia vykdyti tam tikru metu, ir buferiuos kitas neparuoštas instrukcijas. Jei dabartinė instrukcija dar neparengta, procesorius gali peršokti į priekį, norėdamas pamatyti, ar kažkas kitas yra paruoštas.

Be neįprasto vykdymo, tipiški šiuolaikiniai procesoriai, superskaliarinė architektūra. Tai reiškia, kad procesorius bet kuriuo metu kiekviename vamzdyno etape vienu metu vykdo daugybę instrukcijų. Be to, šimtai kitų gali laukti, kol jie pradės egzekuciją. Kad galėtų vienu metu vykdyti daugybę nurodymų, jie turės kelias kiekvieno vamzdyno etapo kopijas procesoriuose. Jei procesorius mato, kad dvi komandos yra paruoštos vykdyti, ir užuot laukęs, kol jos baigsis atskirai, jis vykdo abi tuo pačiu metu, jei tarp jų nėra priklausomybės. Dažnas to taikymas vadinamas „Vienalaikis daugiasluoksnis (SMT)“, dar vadinamas „Hyper-Threading“. Nors „Intel“ ir AMD procesoriai šiuo metu palaiko dvikryptį SMT, IBM sukūrė lustus, palaikančius aštuonių krypčių SMT.

Norėdami atlikti šį kruopščiai choreografuotą vykdymą, procesorius be pagrindinio branduolio turi daug papildomų elementų. Procesoriuje yra šimtai atskirų modulių, kurių kiekvienas atitinka konkretų tikslą, tačiau mes aptarsime pagrindus. Dvi didžiausios ir naudingiausios yra talpyklos ir šakos numatikliai. Papildomos struktūros, kurių neapimsime, apima tokius dalykus kaip buferių pertvarkymas, įrašų slapyvardžių lentelės ir rezervavimo stotys.

Talpyklų paskirtis gali būti paini, nes jose dažnai saugomi tokie duomenys kaip RAM arba SSD. Talpyklos skiriasi prieigos delsomis ir greičiu. Nors operatyvioji atmintis yra ypač greita, ji yra labai lėta procesoriaus dydžio tvarka. Norėdami atsakyti į duomenis, RAM gali užtrukti šimtus ciklų, o procesorius pakimba nieko neveikdamas. Jei duomenys nėra RAM atmintyje, norint pasiekti SSD duomenis, gali prireikti dešimčių tūkstančių ciklų. Be talpyklų mūsų perdirbėjai sustojo.

Procesoriai paprastai turi tris talpyklos lygius. atminties hierarchija. L1 talpykla yra mažiausia ir greičiausia, L2 yra viduryje, o L3 talpykla yra didžiausia ir lėčiausia. Virš hierarchijos talpyklų yra nedideli įrašai, kuriuose skaičiuojant saugoma viena duomenų vertė. Šie įrašai pagal dydį yra greičiausi jūsų sistemos saugojimo įrenginiai. Kai kompiliatorius konvertuoja aukšto lygio programą į kompiliavimo kalbą, jis nustato geriausią šių registrų naudojimo būdą.

Kai procesorius prašo duomenų iš atminties, jis pirmiausia patikrina, ar tie duomenys yra saugomi L1 talpykloje. Jei taip, duomenis galima greitai pasiekti vos per kelis ciklus. Jei jo nėra, procesorius patikrina L2, tada ieško L3 talpyklos. Talpyklos dažniausiai branduolyje įgyvendinamos skaidriai. Branduolys paprašys tik tam tikrų duomenų apie tam tikrą atminties adresą ir atsakys bet kuriame jo hierarchijos lygyje. Dydis ir vėlavimas paprastai didėja didumo tvarka, kai pereiname į vėlesnius atminties hierarchijos etapus. Galų gale, jei procesorius neranda ieškomų duomenų nė vienoje iš talpyklų, tik tada jis pateks į pagrindinę atmintį (RAM).

Įprastame procesoriuje kiekvienas branduolys turės dvi L1 talpyklas: vieną - duomenims, o kitą - instrukcijoms. L1 talpyklos iš viso yra apie 100 kilobaitų, o dydis gali skirtis priklausomai nuo lusto ir kartos. Kiekvienoje architektūroje paprastai yra L2 talpykla, tačiau kai kurias architektūras galima bendrinti tarp dviejų branduolių. L2 talpyklos paprastai yra keli šimtai kilobaitų. Galiausiai yra viena L3 talpykla, kuri yra maždaug dešimtys megabaitų, dalijama visuose branduoliuose.

Kai procesorius vykdo kodą, jo naudojamos instrukcijos ir duomenų reikšmės yra talpykloje. Tai žymiai pagreitina vykdymą, nes procesoriui nereikia nuolat eiti į pagrindinę reikalingų duomenų atmintį. Apie tai, kaip šios atminties sistemos yra įgyvendinamos, pakalbėsime antroje ir trečioje šios serijos dalyje.

Be talpyklų, vienas iš kitų svarbių šiuolaikinio procesoriaus elementų yra teisingas šakos nuspėjamasis. Filialo instrukcijos yra panašios į procesoriaus teiginius „jei“. Jei sąlyga teisinga, vykdomas komandų rinkinys, o jei sąlyga neteisinga, vykdoma komandų seka. Pavyzdžiui, galbūt norėsite palyginti du skaičius ir, jei jie yra lygūs, galite atlikti vieną funkciją, o jei skiriasi, galite atlikti kitą funkciją. Šios filialo instrukcijos yra nepaprastai paplitusios ir gali sudaryti apie 20% visų programos nurodymų.

Iš esmės šios filialo instrukcijos gali neatrodyti problema, tačiau iš tikrųjų teisingai gauti procesorių gali būti labai sunku. Labai svarbu žinoti, nes bet kuriuo metu procesorius vienu metu gali vykdyti dešimt ar dvidešimt instrukcijų kuri vykdymo instrukcijos. Kad nustatytumėte, ar sąlyga teisinga, gali prireikti 5 kilpų, kad nustatytumėte, ar dabartinė komanda yra filialas, ir dar 10 kilpų. Per šį laiką procesorius galėjo pradėti vykdyti dešimtis papildomų instrukcijų, nežinodamas, ar jos teisingos.

Norėdami išspręsti šią problemą, visi šiuolaikiniai didelio našumo procesoriai naudoja techniką, vadinamą spekuliacija. Tai reiškia, kad procesorius vykdys filialo instrukcijas ir nuspės, ar filialas bus įsigytas, ar ne. Jei spėjimas yra teisingas, procesorius pradėjo vykdyti tolesnes instrukcijas, kurios suteikia naudos. Jei spėjimas neteisingas, procesorius sustabdo vykdymą, pašalina neteisingas instrukcijas, kurias jis pradėjo vykdyti, ir pradeda nuo teisingo taško.

Šie šakų nuspėjamieji yra vieni ankstyviausių mašinistų mokymosi formų, nes sinoptikas palaipsniui mokosi šakų elgesio. Jei jis spėja per daug neteisingai, jis pradės mokytis teisingo elgesio. Dešimtmečiai filialų prognozavimo metodų tyrimų leido daugiau nei 90% tikslumo šiuolaikiniuose procesoriuose.

Nors spekuliacija suteikia didžiulį našumą, ji taip pat atskleidžia pažeidžiamumą, nors procesorius gali vykdyti paruoštas instrukcijas, užuot laukęs užimtų. Garsioji „Spectre“ ataka panaudoja šakos numatymo ir spekuliacijos klaidas. Užpuolikas naudoja specialiai sukurtą kodą, kad priverstų procesorių spekuliaciškai vykdyti kodą, kuris nutekina atminties reikšmes. Kai kurie spekuliacijos aspektai turėjo būti pertvarkyti, siekiant užtikrinti, kad duomenys negalėtų nutekėti, o tai šiek tiek sumažėjo.

Šiuolaikiniuose procesoriuose naudojama architektūra per pastaruosius kelis dešimtmečius nuėjo ilgą kelią. Naujovės ir sumanus dizainas leido padidinti našumą ir geriau naudoti pagrindinę aparatinę įrangą. Centrinių procesorių gamintojai yra itin slapti apie savo procesorių technologijas, todėl neįmanoma tiksliai žinoti, kas vyksta viduje. Tačiau kompiuterių darbo pagrindai yra standartizuoti visuose procesoriuose. „Intel“ gali pridėti paslėptą padažą, kad padidėtų talpyklos paspaudimų rodikliai, arba AMD - išplėstinį šakos įvertiklį, tačiau abu atlieka tą pačią užduotį.

Šis pirmasis žvilgsnis ir apžvalga apėmė daugumą procesorių darbo pagrindų. Kitame skyriuje aptarsime, kaip suprojektuoti komponentai, patenkantys į procesorių, apimantys loginius vartus, laikrodį, energijos valdymą, grandinių schemas ir dar daugiau. Stebėk mus.

Siūlomi skaitiniai:

Pagrindinės antraštės kreditas: Uždarykite Raimudos elektroninę plokštę