Skrivet av mpat:
Inte alls. Jag håller med om hela beskrivningen du gjorde i den här artikeln - och tack för att du skrev det så jag slapp - men det är en punkt där Intel har en flaskhals som de talat väldigt tyst om. Men låt mig peta lite i detaljerna nedan.
Håller med, men vill lägga till att Zen bara kan plocka dessa 6 micro-ops (uops) från 4 olika x86-instruktioner. För att komma upp i 6, måste det således vara två instruktioner som genererar två uops. Intel kan å sin sida bara hantera komplexa x86-instruktioner (som resulterar i mer än en uop) i en dekoder, så de klarar inte mer än en sådan åt gång. I nästan alla fall är detta inte relevant, men Apple's design är lite mer generell här, eftersom ARM är så mycket lättare att koda av en x86.
Det är här Intel har en flaskhals som de andra inte har. Intel kan hantera 4 instruktioner per cykel i den här fasen, medan de andra kan hantera 6 (AMD kan bara hantera 4 flyttalsinstruktioner här, men det beror på andra grejer längre ner och spelar inte så stor roll i vilket fall. De hanterar 6 heltalsinstruktioner, eller 4+2). Undantaget i Intel's fall är att de har micro-op fusion, där de kan ta två speciella micro-ops och hantera dem som om de vore en den här fasen och i schedulern lite längre ner. Detta fungerar dock bara i ett fåtal fall när två micro-ops skall gå igenom samma exekveringsenhet och jobbar på samma data. Detta är en flaskhals i Skylake.
Det är inte så relevant i Haswell, som bara klarar att få fram 5 uops ur cachen eller 4 ur dekodern, men Skylake gjorde denna bredare. Det är därför jag tror att Intel kommer att behöva göra denna bredare med Ice Lake.
AMD är inte så öppna här, men om jag minns rätt är det max 10 på Zen.
OBS också att Intel är väldigt begränsade i exakt vilka instruktioner som kan gå tillsammans (exekveringsportarna), men nu kommer i in på alltför petiga detaljer.
Också OT: Zen och Apple's designer är ganska lika varandra, åtminstone bakänden. Jim Keller har designat bägge.
Den här artikeln tyder på att det kan ha gått till ungefär som du beskriver:
https://cyber.wtf/2017/07/28/negative-result-reading-kernel-m...
Back-end i Zen var initialt tänkt till att både används för just Zen (x86) men också K12 (ARMv8). Så inte alls förvånande att back-end liknar "big-core" ARM, den ligger rätt mycket mitt emellan Cortex A57/A75 och Apples design.
I de flesta fall spelar det väldigt liten roll om front-end är x86 eller ARM, men antal pipelines för minnesoperationer i Zen känns mer ARM än x86 (CISC-rötterna gör minnesoperationer vanligare för x86 än för ARM, men dagens kompilatorer gör sitt bästa för att minska denna skillnad, se nedan).
x86 och ARM har också väldigt olika minneskonsistensmodell, ARMv8 har en i det närmaste optimal design för multitrådad C11/C11++ kod (x86 är onödigt strikt vilket försämrar vissa optimeringsmöjligheter, så ARMv8 har något bättre teoretisk möjlighet att hantera många kärnor)! Så nog inte helt enkelt att göra en back-end som fungerar optimalt för både x86 och ARM...
Räknar man micro-op fusion (slå ihop en jämförelse samt ett hopp villkorat på den jämförelsen) ökar antal x86 instruktioner som Core kan hantera med en. Är fyra x86 för Core2 till Broadwell, fem vid micro-op fusion.
Ja, är helt sant att det bara finns en "komplex" decoder. Men åter igen, är kompilatorer och inte människor som skriver maskinkod idag -> finns en väldigt bra orsak varför Intel inte "fixar" denna begränsning: det är inte en begränsning i praktiken då man helst vill hålla saker i register och när saker ligger i register blir alla "normala" instruktioner även en enda micro-op.
Sedan genererar relativt "komplexa" instruktioner faktiskt bara en micro-op. T.ex.
Rent tekniskt är detta load+add (typisk CISC, RISC kan bara göra aritmetik mot register), men blir ändå bara en micro-op. Det omvända genererar dock två micro-op
Detta är rent tekniskt load+add+store.
Ett lackmustest här: om det vore en signifikant flaskhals att bara ha en "complex" decoder, hur kommer det sig då att Skylake ökade sin IPC rätt mycket över Broadwell för vanlig heltalskod (t.ex. spel)? Är ju samma bredd på back-end, men högre "retire" samt "front-end" rate. Att öka "retire-rate" från fyra till fyra per tråd hade varit meningslöst om man inte kan generera fler än fyra micro-ops i front-end tillräckligt ofta. Den "komplexa" avkodaren klarar bara 4 micro-ops, efter det måste den ta till microkod.
Är helt sant att Zen har mer generella heltals-pipeliens. Men då måste man även ta in en annan "detalj" i ekvationen. Zen använder sig av en distribuerad instruktionsschemaläggare, så finns inte en stor kö utan många rätt små (14 steg) där man redan vid "dispatch" måste gissa vilken pipeline som är optimal.
Intel har en central instruktionsschemaläggare, d.v.s. dispatch-steget stoppar bara in instruktionerna i en stor central back-end kö där man sedan först vid execute behöver välja vilken port som hanterar instruktionen. Är t.ex. en port som i praktiken bara kan hantera enkla aritmetiska operationer, shift samt hopp. Givet att var 4:e till 5:e x86 instruktion i genomsnitt är ett hopp så är en sådan begränsning rätt irrelevant när man har en central instruktionsschemaläggare, framförallt när den centrala kön man kan välja ur är ~100 instruktioner stor (är inte hela ROB).
Detta är en rätt gigantiskt "detalj"...
Vidare, att back-end är "bredare" än front-end är ett sätt att dels hantera asymmetri i exekveringsportar men också så att man kan "jobba ikapp" efter en pipe-line stall (som t.ex. TLB-miss eller annan cache-miss). Finns ju ett par till köer som jag utelämnade, dessa börjar fyllas upp om man t.ex. får en cache-miss. När denna är klar finns då potentiellt väldigt många instruktioner som har all indata under en väldigt kort tid.
Huvudpoängerna var ändå: ROB har förändrats radikalt från Core2 till Skylake, det vid varje "tock".
ROB möjliggör bl.a. spekulativ exekvering, verkar vara just spekulativ exekvering som är root till problemet som beskrivs i artikeln.
En bi-poäng: tror inte AMD är så jätteglada över detta, Intel är så dominerande på x86 så detta kommer påverka alla x86-designer mer eller mindre. Om någon sitter och tvår sina händer just nu är det nog Qualcomm och Cavium. Måste vara mumma för deras just lanserade ARMv8 server-kretsar!
En stor fördel med ARM över x86 är att sannolikheten för buggar är mindre i ARM då det är en långt enklare ISA -> betydligt enklare att validera!