Dobro pitanje ili barem jedno sa zanimljivim odgovorom. Dio ovog odgovora prikazuje svijet u kojem bi se CPU mogli učinkovito skalirati u širinu, umjesto s više odvojenih jezgri. Modeli licenciranja / cijene bili bi drugačiji!
Ostalo objašnjava zašto ne mogu. Sažetak:
- TTrošak više jezgri skali blizu linearno
- Trošak proširenja superskalarnih cjevovoda 1 jezgre ~ kvadratno To je izvedivo s dovoljno grube sile, ionako do određene točke. Izvedba s jednim navojem je vrlo važna za interaktivnu upotrebu (važna je latencija, a ne samo protok), tako da trenutni high-core CPU-ovi plaćaju tu cijenu. npr. Skylake (4 širine), Ryzen (5 ili 6 širina) i Appleov A12 (7 širina za velike jezgre, 3 širine za male energetski učinkovite jezgre)
- Ozbiljni diminishing IPC vraća se samo širenjem cjevovoda većim od 3 ili 4 širine, čak i s izvršenjem izvan reda kako bi se pronašao ILP. Propusti u granama i predmemorije su teški i još uvijek zaustavljaju cijeli cjevovod.
-
Niste spomenuli frekvenciju, već samo IPC, ali i frekvencija skaliranja je teška. Veća frekvencija zahtijeva veći napon, pa se power vaga s frekvencijom cubed: ^ 1
od frekvencije izravno, a ^ 2
od napona. (Kondenzatorska energetska skala pohranjuje se s V ^ 2, a većina dinamičke snage koja prelazi struju propuštanja dolazi od pumpanja naboja u kapacitivna opterećenja FET ulaza + žica.)
Izvedba = učestalost puta IPC. (Unutar iste arhitekture. Širi SIMD omogućuje vam da obavite isti posao s manje uputa, a neki su ISA gušći od drugih, npr. MIPS često uzima više uputa za obavljanje istog posla od x86 ili AArch64.)
Troškovi su u području umrijenja (proizvodni trošak) i / ili snage (što neizravno ograničava frekvenciju jer je hlađenje teško). Također, niža snaga i performanse po vatu cilj je sam po sebi, posebno za mobilne uređaje (baterija) i poslužitelje (gustoća snage / troškovi hlađenja / troškovi električne energije).
Prije nego što je stvar bila višejezgrena po utičnici, imali ste sustave s više utičnica za high-end slučajeve upotrebe kada ste željeli veću propusnost nego što je to bilo moguće postići jednim CPU-om koji se može proizvesti, pa su to bili jedini SMP sustavima. (Poslužitelji, vrhunske radne stanice).
Ako se jedna jezgra može skalirati na toliko učinkovit način koliko želite, imali bismo sustave s 1 fizičkom jezgrom po utičnici i SMT (npr. HyperThreading) kako bi im se omogućilo da djeluju kao višestruke logičke jezgre. Tipična stolna / prijenosna računala imala bi samo 1 fizičku jezgru i ne bismo se trudili paralelizirati stvari koje se linearno ne skaliraju s više jezgri. npr. make -j4
da biste iskoristili prednosti višetonskih poslužitelja i / ili da biste sakrili kašnjenje I / O na radnoj površini. (Ili bismo možda ipak pokušali paralelizirati puno ako se širina cjevovoda lako skalira, ali IPC nije, pa smo morali koristiti više SMT niti.) Vaša jezgra OS-a i dalje bi trebala raditi na svim logičkim jezgrama, osim na način na koji CPU predstavlja SMT za OS vrlo različit, pa bi tamo i dalje bili potrebni paralelni algoritmi raspoređivanja i zaključavanja.
Donald Knuth rekao je u intervjuu 2008.
Mogao bih malo zapaliti svoju osobnu nesreću trenutnim trendom prema višejezgrenoj arhitekturi. Meni se čini više-manje kao da je dizajnerima hardvera ponestalo ideja i da pokušavaju prebaciti krivnju za buduću propast Mooreova zakona na autore softvera dajući nam strojeve koji rade brže samo na nekoliko ključna mjerila!
Da, da imamo čudotvorne jednojezgrene procesore s 8 puta većim protokom na stvarnim programima , vjerojatno bismo ih i dalje koristili. Sa sustavima s dvostrukim utičnicama samo kada je vrijedilo platiti puno više za veću propusnost (ne izvedbu s jednim navojem).
Više procesora smanjuje troškove prebacivanja konteksta kada se izvodi više programa (dopuštajući im da se istodobno rade paralelno, umjesto brzog prebacivanja između njih); preventivno multitasking prekidanje masivne neispravne mehanizacije za takvu CPU vjerojatno bi naštetilo još više nego sada.
Fizički bi to bila jedna jezgra (za jednostavnu hijerarhiju predmemorije bez međusobnih veza između jezgri), ali podržala bi SMT (npr. Intelov HyperThreading) pa bi je softver mogao koristiti kao 8 logičkih jezgri koje se dinamički natječu za protok resursi. Ili kad se samo 1 nit izvodi / nije zaustavila, to bi u potpunosti iskoristilo.
Dakle, koristili biste više niti kada je to zapravo bilo lakše / prirodnije (npr. odvojeni procesi koji se istodobno izvode) ili za lako paralelizirane probleme s lancima ovisnosti koji bi spriječili maksimiziranje IPC-a ove zvijeri.
Ali nažalost Knuthovo je željno razmišljanje da višejezgreni CPU u ovom trenutku više neće biti stvar.
Skaliranje izvedbe s jednom niti
Mislim da bi, ako bi napravili jednojezgreni ekvivalent 8-jezgrenom CPU-u, ta jedna jezgra imala 800-postotni porast IPC-a, tako da biste dobili pune performanse u svim programima, a ne samo u onima koji su optimizirani za više jezgri.
Da, to je istina. Ako bi uopće bilo moguće izraditi takav CPU, bilo bi vrlo nevjerojatno. Ali mislim da je to doslovno nemoguće u istom proizvodnom procesu poluvodiča (tj. Jednaka kvaliteta / učinkovitost tranzistora). To sigurno nije moguće s istim proračunom napajanja i površinom matrice kao 8-jezgreni CPU, iako biste uštedjeli na logici za lijepljenje jezgri i ne bi trebalo toliko prostora za privatne predmemorije po jezgri.
Čak i ako dopustite povećanje frekvencije (budući da je stvarni kriterij rad u sekundi, a ne rad po satu), stvaranje čak 2x bržeg CPU-a bio bi velik izazov.
Kad bi bilo moguće negdje u blizini istog proračuna snage i područja umrijeti (dakle troškovi proizvodnje) izraditi takav CPU, da, dobavljači CPU-a već bi ih tako izgradili.
Konkretno, odjeljak Više jezgri ili šire jezgre? Odjeljak , radi potrebne pozadine za razumijevanje ovog odgovora; započinje jednostavno s načinom rada redoslijeđenih cjevovodnih CPU-a, a zatim superskalarnim (više uputa po satu). Zatim objašnjava kako smo pogodili zid napajanja točno oko P4 ere, što je dovelo do kraja lakog skaliranja frekvencije, ostavljajući uglavnom samo IPC i obavljajući više posla po uputi (npr. SIMD) kao put naprijed, čak i s manjim tranzistorima.
MŠirenje cjevovoda (maksimalne upute po satu) obično skalira trošak kao kvadrat širine . Taj se trošak mjeri u površini matrice i / ili snazi, radi šire paralelne provjere ovisnosti (otkrivanje opasnosti) i šireg planera koji ne radi kako bi pronašao spremne upute za pokretanje. I više portova za čitanje / pisanje u vašoj datoteci registra i predmemoriji ako želite pokretati upute koje nisu nop
. Pogotovo ako imate upute s 3 unosa poput FMA ili add-with-carry (2 registra + zastavice).
Ta također se smanjuju povrati IPC-a zbog širenja CPU-a; većina radnih opterećenja ima ograničeni ILP malog opsega / kratkog dometa (paralelizam na razini uputa) za korištenje CPU-a, tako da širenje jezgre ne povećava IPC (upute po taktu) ako je IPC već ograničen na manje od širine jezgre lancima ovisnosti, propustima grana, propustima predmemorije ili drugim stajama. Sigurno biste postigli ubrzanje u nekim odmotanim petljama s neovisnim iteracijama, ali to nije ono što većina koda provodi većinu svog vremena radeći. Upute za usporedbu / grane čine 20% kombinacije uputa u "tipičnom" kodu, IIRC. (Mislim da sam pročitao brojeve od 15 do 25% za razne skupove podataka.)
Također, promašaj predmemorije koji zaustavlja sve ovisne upute (a zatim sve nakon što se postigne ROB kapacitet) više košta za širi CPU. (Oportunitetni trošak ostavljanja više izvršnih jedinica u praznom hodu; više potencijalnih poslova se ne završi.) Ili propust grane na sličan način uzrokuje balon.
T Da bismo dobili 8x IPC, trebat će nam barem 8x poboljšanje točnosti predviđanja grana i brzine učitavanja u predmemoriji. Ali stope učitavanja u predmemoriji ne mijenjaju se dobro s kapacitetom predmemorije koji je prošao određenu točku za većinu radnih opterećenja. A HW unaprijed dohvaćanje pametno je, ali ne može biti toliko pametno. A na 8x IPC, granski prediktori trebaju proizvesti 8x više predviđanja po ciklusu, kao i da budu preciznija.
Currentne tehnike za izgradnju izvanrednih izvršnih procesora mogu pronaći ILP samo u kratkim dometima. Na primjer, Skylakeova veličina ROB-a je 224 uops fused-domain, a planer za neizvršene uops-e 97 unfused-domain. Pogledajte Razumijevanje utjecaja ograde na petlju s dva dugačka lanca ovisnosti, radi povećanja duljina za slučaj kada je veličina planera ograničavajući faktor u izdvajanju ILP-a iz 2 dugačka lanca uputa, ako dobiju predugo dugo. I / ili pogledajte ovaj općenitiji i uvodniji odgovor).
Dakle, pronalaženje ILP-a između dvije odvojene duge petlje nije nešto što možemo učiniti s hardverom. Dinamična binarna rekompilacija za fuziju petlje mogla bi biti moguća u nekim slučajevima, ali teško, a ne nešto što CPU stvarno može učiniti ako ne krene putem Transmeta Crusoe. (x86 emulacijski sloj na vrhu drugog internog ISA-a; u tom slučaju VLIW). No, standardni moderni x86 dizajn s uop predmemorijama i moćnim dekoderima nije lako pobijediti većinu koda.
A izvan x86, sve ISA-ove koji se još uvijek koriste relativno je lako dekodirati, tako da nema motivacije za dinamičku rekompilaciju osim optimizacija na velike udaljenosti. TL: DR: nadajući se da će magični kompajleri koji mogu izložiti više ILP-a hardveru nisu uspjeli za Itanium IA-64 i vjerojatno neće uspjeti za superširok CPU za bilo koji postojeći ISA sa serijskim modelom izvršenja.
Ako ste imali superširok CPU, zasigurno biste željeli da podržava SMT, tako da ga možete napuniti radom izvođenjem više niti s niskim ILP-om.
Budući da je Skylake trenutno širok 4 uops (i postiže stvarni IPC od 2 do 3 uopsa po satu, ili čak bliži 4 u visokopropusnom kodu), hipotetički 8x širi CPU bio bi širok 32!
Mogućnost urezivanja toga natrag u 8 ili 16 logičkih CPU-a koji dinamički dijele te resurse izvršavanja bilo bi fantastično: nestalne niti dobivaju svu propusnost pročelja i pozadinsku propusnost.
Ali s 8 odvojenih jezgri, kada se nit zaustavi, ništa drugo ne može održavati jedinice izvršenja; ostale niti nemaju koristi.
Izvršenje je često brzo: zaustavlja se čekajući propušteno učitavanje predmemorije, a nakon što stignu paralelno mnoge upute, taj rezultat može koristiti. S superširokim CPU-om taj rafal može ići brže i zapravo može pomoći kod SMT-a.
Ali ne možemo imati čarobne superširoke procesore
Dakle, da bismo postigli protok, umjesto toga moramo izložiti paralelizam hardveru u obliku thread-paralelizma. Općenito kompajleri nisu sjajni u znanju kada / kako koristiti niti, osim u jednostavnim slučajevima poput vrlo velikih petlji. (OpenMP ili gcc-ove -ftree-parallelize-petlje
). I dalje je potrebna ljudska pamet kako bi se preradio kôd kako bi se paralelno učinkovito obavljao koristan posao, jer je komunikacija između niti skupa, a isto tako i pokretanje niti.
TLP je grubozrnati paralelizam, za razliku od sitnozrnog ILP-a unutar jedne niti izvršenja koju HW može iskoristiti.
CPU usmjereni na interaktivno radno opterećenje (poput Intel / AMD x86 i Apple / ARM AArch64 high-end jezgri) definitivno do gura u sve manje povrata IPC skaliranja, jer izvedbe s jednim navojem i dalje su toliko vrijedne kad je latencija samo protok za masovno paralelne probleme.
Mogućnost paralelnog pokretanja 8 primjeraka igre pri 15 sličica u sekundi mnogo je manje vrijedna od mogućnosti pokretanja jedne kopije pri 45 sličica u sekundi. Dobavljači CPU-a to znaju i zato moderni CPU koriste izvršavanje bez narudžbe, iako to košta značajnu snagu i površinu. (Ali GPU-i nemaju jer im je radno opterećenje već uvelike paralelno).
Intelov višejezgreni Xeon Phi hardver (Knight's Landing / Knight's Mill) zanimljiva je pola puta: vrlo ograničeno izvršavanje izvan redoslijeda i SMT za održavanje 2-širokih jezgri napajanih AVX512 SIMD uputama za krčenje brojeva. Jezgre se temelje na Intelovoj arhitekturi Silvermont male snage. (Izvršeno izvan reda, ali s malim prozorom za promjenu redoslijeda, puno manjim od velike jezgre obitelji Sandybridge. I užim cjevovodom.)
BTW, sve je ovo ortogonalno SIMD-u. Dovršenje više posla po uputi uvijek pomaže ako je to moguće zbog vašeg problema.
Modeli određivanja cijena
Modeli određivanja cijena softvera temelje se na trenutnom okruženju hardvera.
Modeli licenciranja po jezgri postali su sve rašireniji (i relevantni čak i za radne površine s jednom utičnicom) pojavom višejezgrenih procesora.Prije toga bio je relevantan samo za poslužitelje i velike radne stanice.
Da softveru nije potrebno više jezgri za rad pri najvećoj brzini, ne bi zapravo postojao način da ga jeftinije proda ljudima koji od toga ne ostvaruju toliko koristi jer ga pokreću na slabijem procesoru.Osim ako možda softverski / hardverski ekosustav nije razvio kontrole na "SMT kanalima" koje vam omogućavaju da konfigurirate maksimalnu širinu izvršavanja koda pokrenutog na toj logičkoj jezgri.(Opet zamišljajući svijet u kojem se procesori skaliraju u širini cjevovoda umjesto više zasebnih jezgri.)