Skrivet av Landelusen:
Varför envisas man med att skriva x86? Är det inte amd64 som är den prominenta arkitekturen idag?
x86 är samlingsnamnet för allt som är x86. x86_64 brukar användas för 64-bitars extensionen till x86 (eller IA32 som det formellt heter) som är gemensamt för Intel och AMD.
För om man riktigt ska vara petnoga finns två varianter av 64-bit x86 som är nästan, men bara nästan, helt kompatibla: AMD som kallas AMD64 och Intel som efter flera namnbyten nu heter Intel64.
För "normal" program är AMD64 och Intel64 identiskt, för de som skriver OS-kärnor finns ett par små skillnader.
Skrivet av Kilroy:
Vad är det som gör att ARM är så mycket effektivare?
Vad är det x86-64 är bättre på än ARM?
Och det jag undrar är ju just vad det är som gör x86-64 till ett kråkslott och vad är det det nybyggda ARM64 huset har skalat bort?
Jag borde ställt min fråga lite tydligare, på den nivån förstår jag det. Och lite djupare än så.
Men vad är det som man har lärt sig?
Vilka förbättringar har en gjort och vilka onödiga saker har man skalat bort som gör så enorm skillnad?
Är lite svårt att peka på någon specifik finess i ARM64 (AArch64) som gör den effektivare än både x86 men även än 32-bitars ARM!
Att just ISA är en stor komponent i detta kan man se här där samma CPU körde samma program, fast kompilerat för 32-bitars ARM resp. 64-bitars ARM.
ARM64 är inte en utökning av 32-bit ARM, det är en helt ny instruktionsuppsättning som lanserades så sent som 2010. D.v.s. tillräckligt sent för att man skulle kunna fundera hur man bäst hanterar aktuella trender som fokus på IPC i stället för frekvens, fokus på fler kärnor i stället för snabbare kärnor, etc.
Det intressanta är att innan AArch64 var nog de flesta rätt överens om att ISA spelar inte jättestor roll, är långt viktigare vilken mikroarkitektur som används då moderna CPUer ändå slår isär instruktionerna till "interna" instruktioner som påminner rätt mycket om varandra oavsett ISA. ARM tänkte helt klart utanför boxen här, de tittade på vad som begränsade att man ökar IPC ännu mer för PowerPC, MIPS, SPARC m.fl. har instruktioner som är exakt 32-bitar, de har 32 register, etc. Men ändå hade de inget direkt övertag mot x86_64 i IPC givet ungefär likartad mikroarkitektur.
Sättet ARM64 instruktioner är designade verkar möjliggöra långt högre IPC. Sättet denna ISA är designad skiljer sig fundamentalt från både 32-bit ARM och andra ISA i att extremt få instruktioner påverkar något form av "globalt" tillstånd (CPU-flaggor och annat som gör att instruktion X kan implicit påverka hur instruktion X+N uppför sig).
Är annars svårt att förstå varför både AMD och Intel stannat vid att maximalt kunna köra 4 st x86 instruktioner per cykel. Detta har varit fallet sedan Nehalem för Intel och sedan Zen 1 för AMD. Apple A12 kan köra upp till 7 AArch64 instruktioner per cykel, ställer man samma C/C++/C#/Java/Rust program mot varandra och jämför antalet x86_64 resp. AAarch64 instruktioner det kompilerar till är det i genomsnitt i alla fall inte fler AArch64 instruktioner som behövs!
Cortex A53 och A57 som testas i grafen jag länkade är med dagens mått extremt simpla CPUer. Cortex A72 som används i RPi4 verkar se ännu större vinst av att gå från 32-bit ARM till 64-bit ARM kod. Gissar att dagens snabbaste ARM-designer vinner ännu lite mer då de innehåller allt större möjligheter att köra flera instruktioner samma cykel (superskalär) och större grad av att spekulera om hur saker kommer uppföra sig i framtiden (out-of-order). Mätningen ovan är också några år gammal, Aarch64 är väldigt nytt så det har varit ganska stora förbättringar i prestanda med nya kompilatorer, x86_64 (och även 32-bit ARM) är ju så mogna att man där plockat i princip alla frukter som finns, högt som lågt hängande så inget relevant händer sett till prestanda mellan versioner.
Så primärt verkar det som ARM lyckats med de rätt många inte riktigt trodde på längre: de har skapat en ISA som passar klart bättre till hur vi i alla fall för tillfället utvecklar program än någon annan tidigare lyckats med. Möjligen kan RISC-V ha liknande fördelar, men går inte att veta innan något byggt något likt A12/A13 för den instruktionsuppsättningen.
För man ska vara medveten att A13 trots allt tar mindre kretsytan än t.ex. Zen 2 på samma TSMC 7 nm process (Zen 2 är ~40 % större) ändå utför A13 ~80 % mer per cykel. Cortex A76 utför ungefär lika mycket som Zen 2 per cykel, men den tar bara 1/3 av kretsytan! Så är uppenbart att något gör att ARM64 är väsentligt bättre på att ta tillvara de transistorer man stoppar in CPUn. Svårare att göra en direkt jämförelse mot Intel då det är en annan tillverkningsprocess.