Allvarlig sårbarhet upptäckt i Apples systemkretsar

Permalänk
Melding Plague

Allvarlig sårbarhet upptäckt i Apples systemkretsar

”Gofetch” gör det möjligt att komma åt kryptografiska nycklar genom en attack på cache-systemet i Apples M1-, M2- och M3-kretsar.

Läs hela artikeln här

Visa signatur

Observera att samma trivselregler gäller i kommentarstrådarna som i övriga forumet och att brott mot dessa kan leda till avstängning. Kontakta redaktionen om du vill uppmärksamma fel i artikeln eller framföra andra synpunkter.

Permalänk
Datavetare

Vilken överraskning, en side-channel attack i den CPU-design med i nulägets världens djupaste out-of-order execution fönster...

Skrivit det flera gånger tidigare här: är det inte dags att acceptera att man får designa för prestanda eller bombsäker implementation för kryptering. Det är verkligen ett "välj en" fall.

Enda positiva är väl att också detta fall delar egenskapen hos liknande problem hos andra CPUer: krävs i praktiken att den som vill utnyttja sårbarheten har möjlighet att fritt köra program lokalt på datorn. I vissa lägen ett problem i moderna datacenter, förhoppningsvis ett mindre problem på den genomsnittliga laptop/desktop-datorn.

Precis som nu alla moderna CPUer designade för bärbara har "AI-accelering" via NPU bör man framåt designa krypto-bibliotek på samma sätt. Går faktiskt att hantera väl även på många existerade CPU, alla de med "små" kärnor som likt fallet här i stort sätt helt undviker den här typen av problem.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

"Apple kan så klart inte fixa en sårbarhet som ligger i själva kretsarna."

Det är inte omöjligt att Apple kan uppdatera en mikrokod eller liknande teknik för att ändra hur DMP jobbar och därigenom mitigera denna säkerhetsbrist. Dagens kretsar är så avancerade att man troligtvis i hårdvara vill ta höjd för att i efterhand kunna ändra hur hårdvaran jobbar från mjukvara.

Permalänk

Och mer kommer hittas när folk på betalt arbetstid kan få lägga ner all sin tid på att hitta säkerhetshål.
Detta tillskillnad på förr i tiden när duktiga utvecklare som hade 100% faktueringskrav oavsett vad som händer och korta deadlines, där de på sin fritid som knappt existerade, kunde om de orkade hålla på och leta säkerhetshål ofta utanför deras arbetsuppgift.

Det stora hotet för vanliga personer idag är webbsidor, våra webbläsare kör all mer kod. Om detta går utnyttjas genom webbläsaren så är det ett stort problem, om inte, så folk installerar knappt några program från ej kända tillverkare, speciellt inte på en Mac. "Speldatorn i pojkrummet" har nog mer skumt i sig.

Permalänk
Medlem

Där kom den!

Visa signatur

Ryzen 9 5950X, 32GB 3600MHz CL16, SN850 500GB SN750 2TB, B550 ROG, 3090 24 GB
Har haft dessa GPUer: Tseng ET6000, Matrox M3D, 3DFX Voodoo 1-3, nVidia Riva 128, TNT, TNT2, Geforce 256 SDR+DDR, Geforce 2mx, 3, GT 8600m, GTX460 SLI, GTX580, GTX670 SLI, 1080 ti, 2080 ti, 3090 AMD Radeon 9200, 4850 CF, 6950@70, 6870 CF, 7850 CF, R9 390, R9 Nano, Vega 64, RX 6800 XT
Lista beg. priser GPUer ESD for dummies

Permalänk
Medlem
Skrivet av Yoshman:

Vilken överraskning, en side-channel attack i den CPU-design med i nulägets världens djupaste out-of-order execution fönster...

Skrivit det flera gånger tidigare här: är det inte dags att acceptera att man får designa för prestanda eller bombsäker implementation för kryptering. Det är verkligen ett "välj en" fall.

Enda positiva är väl att också detta fall delar egenskapen hos liknande problem hos andra CPUer: krävs i praktiken att den som vill utnyttja sårbarheten har möjlighet att fritt köra program lokalt på datorn. I vissa lägen ett problem i moderna datacenter, förhoppningsvis ett mindre problem på den genomsnittliga laptop/desktop-datorn.

Precis som nu alla moderna CPUer designade för bärbara har "AI-accelering" via NPU bör man framåt designa krypto-bibliotek på samma sätt. Går faktiskt att hantera väl även på många existerade CPU, alla de med "små" kärnor som likt fallet här i stort sätt helt undviker den här typen av problem.

Fast nu är det ju inte OoO som är problemet och har inte heller varit tidigare, alla problemen kommer från den spekulativa exekveringen i moderna CPU:er. OoO påverkar ju inte säkerheten, det gör bara att läsningar/skrivningar inte sker i exakt den ordningen som du som programmerare tror, de sker fortfarande sekventiellt.

Visa signatur

|Ryzen 5800x3d|RX 7900XTX Hellhound|Asus Prime X370 Pro|32GiB Corsair 2400MHz CL16 Vengeance|Corsair HX1000i|Fractal Define R5|LG 45GR95QE|Corsair K100|Razer DeathAdder V3 Pro|Ubuntu 23.10|

Permalänk
Datavetare
Skrivet av F.Ultra:

Fast nu är det ju inte OoO som är problemet och har inte heller varit tidigare, alla problemen kommer från den spekulativa exekveringen i moderna CPU:er. OoO påverkar ju inte säkerheten, det gör bara att läsningar/skrivningar inte sker i exakt den ordningen som du som programmerare tror, de sker fortfarande sekventiellt.

Anledningen att man måste ta till saker som Data Memory-Dependent Prefetchers (DMPs) är att utan dessa kommer djupare OoO inte hjälpa för det kommer inte finnas data tillräckligt snabbt för att utnyttja alla beräkningskapacitet back-end i CPUn har. Det är specifikt DMP som denna sårbarhet utnyttjar.

Intel är inte out-of-the-woods, det enda som konstaterats att metoden som fungerar på M1/M2/M3 fungerar inte på Raptor Cove. Man kan mycket väl hitta andra sätt, likt hur vissa SMT sårbarheter bara fungerar på Intels modeller medan andra bara fungerar på AMDs modeller.

Apples CPU är i nuläget den "bredaste" mikroarkitektur som existerar, enda som är i närheten är Arm Cortex X4 (och snart även Snapdragon X Elite). Utan "trick" som DMP och ett gäng andra skulle det vara helt omöjligt för en CPU att utföra ~50 % mer instruktioner per cykel jämfört med Intel/AMDs bästa (nu har även Raptor Cove DMP, så räcker inte enbart med detta men det en sak av många för att nå dit).

OoO är specifikt det som orsakar Spectre. Så vitt jag vet är alla OoO-designer drabbade av Spectre, medan de utan OoO-stöd inte är sårbara.

Säkerhet och CPU-prestanda står i allt mer kontrast till varandra. Men känns inte som ett omöjligt problem att lösa givet att det i praktiken är en rätt liten delmängd av vad program utför som spelar roll för säkerheten. Se bara till att göra dessa på beräkningsenheter optimerade för säkerhet, då går det att köra full-steam ahead för resten m.a.p. prestanda.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av lillaankan_i_dammen:

Och mer kommer hittas när folk på betalt arbetstid kan få lägga ner all sin tid på att hitta säkerhetshål.
Detta tillskillnad på förr i tiden när duktiga utvecklare som hade 100% faktueringskrav oavsett vad som händer och korta deadlines, där de på sin fritid som knappt existerade, kunde om de orkade hålla på och leta säkerhetshål ofta utanför deras arbetsuppgift.

Vad yrar du om? Det har alltid funnits statsaktörer som arbetat med att hitta brister som detta, och de är ruggigt bra på det. Det har även länge funnits organiserad brottslighet som gör samma sak.

Visa signatur

There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

@oscar:prutt.party / monotux@freenode

Permalänk
Medlem
Skrivet av Yoshman:

Anledningen att man måste ta till saker som Data Memory-Dependent Prefetchers (DMPs) är att utan dessa kommer djupare OoO inte hjälpa för det kommer inte finnas data tillräckligt snabbt för att utnyttja alla beräkningskapacitet back-end i CPUn har. Det är specifikt DMP som denna sårbarhet utnyttjar.

Intel är inte out-of-the-woods, det enda som konstaterats att metoden som fungerar på M1/M2/M3 fungerar inte på Raptor Cove. Man kan mycket väl hitta andra sätt, likt hur vissa SMT sårbarheter bara fungerar på Intels modeller medan andra bara fungerar på AMDs modeller.

Apples CPU är i nuläget den "bredaste" mikroarkitektur som existerar, enda som är i närheten är Arm Cortex X4 (och snart även Snapdragon X Elite). Utan "trick" som DMP och ett gäng andra skulle det vara helt omöjligt för en CPU att utföra ~50 % mer instruktioner per cykel jämfört med Intel/AMDs bästa (nu har även Raptor Cove DMP, så räcker inte enbart med detta men det en sak av många för att nå dit).

OoO är specifikt det som orsakar Spectre. Så vitt jag vet är alla OoO-designer drabbade av Spectre, medan de utan OoO-stöd inte är sårbara.

Säkerhet och CPU-prestanda står i allt mer kontrast till varandra. Men känns inte som ett omöjligt problem att lösa givet att det i praktiken är en rätt liten delmängd av vad program utför som spelar roll för säkerheten. Se bara till att göra dessa på beräkningsenheter optimerade för säkerhet, då går det att köra full-steam ahead för resten m.a.p. prestanda.

Skulle det hjälpa att tvinga att processera krypto-kod på de små kärnorna kanske? Eller sätta i separat kryptokärna med separat minne (det är väl i någon mening vad TPM är iofs)

Permalänk
Datavetare
Skrivet av medbor:

Skulle det hjälpa att tvinga att processera krypto-kod på de små kärnorna kanske? Eller sätta i separat kryptokärna med separat minne (det är väl i någon mening vad TPM är iofs)

Att använda de små kärnorna är redan föreslaget som en potentiell fix. Är det som bl.a. Crystals kommer använda som "work-around".

OpenSSL kommer inte göra något, "outside of their threat model". Inte heller säkert att Go-teamet kommer göra något åt detta i deras kryptobibliotek, de anser att den reella risken denna sårbarhet är väldigt liten.

Nu är inte "proof-of-concept" släppt än, men givet att @lillaankan_i_dammen nämnde webbläsare: förstår jag attack-vektorn rätt fungerar inte JS. Det ger inte tillräcklig kontroll över hur saker läggs ut i RAM för att det ska fungera + man har inte heller tillräcklig kontroll över tidsmätning. Man behöver ett program skrivet i C, C++, unsafe Rust eller liknande som man kan köra fritt på maskinen för att utnyttja sårbarheten.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Man behöver ett program skrivet i C, C++, unsafe Rust eller liknande som man kan köra fritt på maskinen för att utnyttja sårbarheten.

Man behöver också tio meter lång kedja, en traktor, och en svets.

Är detta ännu en sårbarhet som är isolerad till forskarvärlden, eller något som i praktiken är sannolikt att användas? När "password" är ett populärt lösenord känns det spontant som att det finns en miljon mer lågt hängande frukter än alla exploits som har upptäcks senaste åren i CPU:er.

Permalänk
Skrivet av Yoshman:

Anledningen att man måste ta till saker som Data Memory-Dependent Prefetchers (DMPs) är att utan dessa kommer djupare OoO inte hjälpa för det kommer inte finnas data tillräckligt snabbt för att utnyttja alla beräkningskapacitet back-end i CPUn har. Det är specifikt DMP som denna sårbarhet utnyttjar.

Intel är inte out-of-the-woods, det enda som konstaterats att metoden som fungerar på M1/M2/M3 fungerar inte på Raptor Cove. Man kan mycket väl hitta andra sätt, likt hur vissa SMT sårbarheter bara fungerar på Intels modeller medan andra bara fungerar på AMDs modeller.

Apples CPU är i nuläget den "bredaste" mikroarkitektur som existerar, enda som är i närheten är Arm Cortex X4 (och snart även Snapdragon X Elite). Utan "trick" som DMP och ett gäng andra skulle det vara helt omöjligt för en CPU att utföra ~50 % mer instruktioner per cykel jämfört med Intel/AMDs bästa (nu har även Raptor Cove DMP, så räcker inte enbart med detta men det en sak av många för att nå dit).

OoO är specifikt det som orsakar Spectre. Så vitt jag vet är alla OoO-designer drabbade av Spectre, medan de utan OoO-stöd inte är sårbara.

Säkerhet och CPU-prestanda står i allt mer kontrast till varandra. Men känns inte som ett omöjligt problem att lösa givet att det i praktiken är en rätt liten delmängd av vad program utför som spelar roll för säkerheten. Se bara till att göra dessa på beräkningsenheter optimerade för säkerhet, då går det att köra full-steam ahead för resten m.a.p. prestanda.

Om Intel också har DMP varför har de inte lika bra prestanda per W som Apple?

Permalänk
Medlem
Skrivet av Dinkefing:

Om Intel också har DMP varför har de inte lika bra prestanda per W som Apple?

Därför att DMP enskilt inte är det som gör Apples processorer så effektiva?

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Datavetare
Skrivet av Dinkefing:

Om Intel också har DMP varför har de inte lika bra prestanda per W som Apple?

Just nu har Apple bättre prestanda totalt sett i många fall. Det är tillräckligt jämnt mellan Apple, Intel och AMD för att det ska finnas specifika fall där någon av dessa hamnar högst.

Varför Intel/AMD inte har i närheten lika bra perf/W beror primärt på att Apple (och även Cortex X serien från Arm) har långt högre prestanda vid en specifik frekvens. Effekten ökar linjärt med frekvens och kvadratiskt med spänning, högre frekvens betyder i praktiken högre spänning om alla kretsar är jämförbara sett till tillverkningsprocess.

Blir då väldigt stor skillnad på två CPU-modeller där en kör ~4 GHz och den andra ~6 GHz för att nå samma absoluta prestanda.

Sen varför det är så är en mix av väldigt många parametrar. Givet hur extremt nära Intel och AMD presterar, trots att de ändå har flera rätt stora skillnader i mikroarkitektur pekar mot att dessa två har en gemensam flaskhals. ISA ansågs länge vara rätt irrelevant för prestanda, vilket nog också stämde så länge mikroarkitekturer var 2-4 wide och högre prestanda primärt kom från högre frekvens.

När man började skala på bredden verkar det som det rätt snabbt tog stopp. Var därför initialt helt obegripligt hur Iphones kunder prestera så brutalt bra i många benchmarks, initiala antagandet från de flesta var: det är något fel på testerna som råkar gynna Iphone. Var väl egentligen vid release av M1 som poletten trillade ned att Apple måste ha lyckats med något ingen annan lyckats med tidigare.

Lite kanske poletten trillat ned för de som jobbade med både 32-bit Arm och ARM64, även på RPi3/RPi4 är det inte ovanligt att se 20-30 % högre prestanda i samma program bara man kompilerar om det från 32-bit Arm till ARM64. P.g.a. av designen hos 32-bit Arm är det svårt att bygga vettiga "breda" mikroarkitekturer som stödjer den ISA, Apple var först att släppa 32-bit Arm och enbart stödja ARM64. Senaste generationerna ARM Cortex A/X stödjer inte heller 32-bit ISA, och i samband med det blev även Cortex X en väldigt bred design.

Intel verkar hålla med kring ISA. Deras kommande APX (finns indikation på att första modellerna kommer 2025) kommer bli den största förändringen av ISA hos x86 någonsin. Svårt att säga hur bra/dåligt det kommer bli innan det finns på marknaden, men på en hög nivå är det rätt mycket ARM64 portat till x86_64... Så är själv inte jättesugen på en ny x86_64 CPU innan den har APX.

Men det finns fler saker än DMP och ISA. Bl.a. har Apples CPUer ett out-of-order fönster som är så stort att många inte riktigt får ihop hur de lyckats med en sådan design. För att bara skala upp en Intel/AMD design till den nivån skulle ge galen transistorbudget.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Anledningen att man måste ta till saker som Data Memory-Dependent Prefetchers (DMPs) är att utan dessa kommer djupare OoO inte hjälpa för det kommer inte finnas data tillräckligt snabbt för att utnyttja alla beräkningskapacitet back-end i CPUn har. Det är specifikt DMP som denna sårbarhet utnyttjar.

Intel är inte out-of-the-woods, det enda som konstaterats att metoden som fungerar på M1/M2/M3 fungerar inte på Raptor Cove. Man kan mycket väl hitta andra sätt, likt hur vissa SMT sårbarheter bara fungerar på Intels modeller medan andra bara fungerar på AMDs modeller.

Apples CPU är i nuläget den "bredaste" mikroarkitektur som existerar, enda som är i närheten är Arm Cortex X4 (och snart även Snapdragon X Elite). Utan "trick" som DMP och ett gäng andra skulle det vara helt omöjligt för en CPU att utföra ~50 % mer instruktioner per cykel jämfört med Intel/AMDs bästa (nu har även Raptor Cove DMP, så räcker inte enbart med detta men det en sak av många för att nå dit).

OoO är specifikt det som orsakar Spectre. Så vitt jag vet är alla OoO-designer drabbade av Spectre, medan de utan OoO-stöd inte är sårbara.

Säkerhet och CPU-prestanda står i allt mer kontrast till varandra. Men känns inte som ett omöjligt problem att lösa givet att det i praktiken är en rätt liten delmängd av vad program utför som spelar roll för säkerheten. Se bara till att göra dessa på beräkningsenheter optimerade för säkerhet, då går det att köra full-steam ahead för resten m.a.p. prestanda.

DMPS tillsammans med OoO ger högre prestanda ja, men du kan skapa en OoO CPU helt utan spekulativ exekvering och du kan skapa en spekulativ CPU helt utan OoO.

OoO innebär enbart att CPU:n kan sortera om loads och stores utifrån vad som den ser som den bästa ordningen oavsett vad du som programmerare har skrivit i koden. Spekulativ exekvering är att CPU:n exekverar kod innan den vet om ifall den verkligen skall exekvera den koden eller ej.

T.ex så är och var ARM väldigt OoO medan x86 är och väldigt lite OoO (x86 är enbart OoO under väldigt specifika situationer vilket gör att många som skriver låsfria algoritmer under x86 plötsligt ser dem crash and burn på en ARM) men x86 är sedan en tid extremt spekulativ, främst vid branch-prediction eftersom branchning är så extremt kostsamt på en x86 då den har så djup pipeline.

OoO och spekulativ exekvering är två helt separata saker. Vad de är är två olika sätt att försöka hålla hela pipelinen upptagen med att exekvera data.

Visa signatur

|Ryzen 5800x3d|RX 7900XTX Hellhound|Asus Prime X370 Pro|32GiB Corsair 2400MHz CL16 Vengeance|Corsair HX1000i|Fractal Define R5|LG 45GR95QE|Corsair K100|Razer DeathAdder V3 Pro|Ubuntu 23.10|

Permalänk
Medlem

Det kunde varit värre, detta kan åtgärdas.

Permalänk
Medlem
Skrivet av Yoshman:

Vilken överraskning, en side-channel attack i den CPU-design med i nulägets världens djupaste out-of-order execution fönster...

Skrivit det flera gånger tidigare här: är det inte dags att acceptera att man får designa för prestanda eller bombsäker implementation för kryptering. Det är verkligen ett "välj en" fall.

Enda positiva är väl att också detta fall delar egenskapen hos liknande problem hos andra CPUer: krävs i praktiken att den som vill utnyttja sårbarheten har möjlighet att fritt köra program lokalt på datorn. I vissa lägen ett problem i moderna datacenter, förhoppningsvis ett mindre problem på den genomsnittliga laptop/desktop-datorn.

Precis som nu alla moderna CPUer designade för bärbara har "AI-accelering" via NPU bör man framåt designa krypto-bibliotek på samma sätt. Går faktiskt att hantera väl även på många existerade CPU, alla de med "små" kärnor som likt fallet här i stort sätt helt undviker den här typen av problem.

Du har alltid så otroligt djupa analyser när det kommer till cpu:er.

Vi borde få en intervju med Yoshman

Visa signatur

thank you, come again

Permalänk
Datavetare
Skrivet av F.Ultra:

DMPS tillsammans med OoO ger högre prestanda ja, men du kan skapa en OoO CPU helt utan spekulativ exekvering och du kan skapa en spekulativ CPU helt utan OoO.

OoO innebär enbart att CPU:n kan sortera om loads och stores utifrån vad som den ser som den bästa ordningen oavsett vad du som programmerare har skrivit i koden. Spekulativ exekvering är att CPU:n exekverar kod innan den vet om ifall den verkligen skall exekvera den koden eller ej.

T.ex så är och var ARM väldigt OoO medan x86 är och väldigt lite OoO (x86 är enbart OoO under väldigt specifika situationer vilket gör att många som skriver låsfria algoritmer under x86 plötsligt ser dem crash and burn på en ARM) men x86 är sedan en tid extremt spekulativ, främst vid branch-prediction eftersom branchning är så extremt kostsamt på en x86 då den har så djup pipeline.

OoO och spekulativ exekvering är två helt separata saker. Vad de är är två olika sätt att försöka hålla hela pipelinen upptagen med att exekvera data.

Du har helt rätt i att spekulativ körning och OoO är två ortogonala koncept.

Fattar inte denna sårbarhet tillräckligt i detalj, men i flera andra fall och specifikt i Spectre är både spekulativ körning och OoO ett krav för att trigga problemet.

Så egentligen ska man säga både OoO och spekulativ körning. Men i praktiken är OoO meningslöst utan spekulativ körning, så det senare är underförstått och många av de här buggarna kommer av kombinationen av dessa två.

Enda OoO CPU jag kunde hitta som inte också har spekulativ körning är den första CPU som använde Tomasulos algoritm på mitten av 1960-talet. OoO började användas först på 90-talet i någon större utsträckning, det efter att in-order designer redan börjat med spekulativ körning.

För in-order designer finns varianter både med och utan spekulativ körning. När Spectre presterandes var ett frågetecken huruvida Arms moderna in-order designer, som har spekulativ körning, var påverkade. De är inte påverkade, däremot är Arms OoO designer påverkade precis som alla moderna OoO designer (som alla också använder spekulativ körning).

Så åter igen: du har rätt att det är separata koncept, men i praktiken betyder "djupare OoO" också både mer och fler varianter av spekulativ körning. Utan det senare vore det helt hopplöst att utnyttja potentialen hos OoO, speciellt i en design som Apple Silicon som både är extremt "bred" och har ett enormt "out-of-order" fönster att utnyttja.

Edit: och bara för att understryka hur komplext det hela är om man försöker få med alla detaljer är detta ett bra exempel

"x86 är enbart OoO under väldigt specifika situationer vilket gör att många som skriver låsfria algoritmer under x86 plötsligt ser dem crash and burn på en ARM"

Detta har varken med spekulativ körning eller OoO att göra. Det har att göra med minneskonsistensmodell.

x86 implementerar en modell som kallas Total Store Order (TSO) medan Arm (likt de flesta RISC:ar, men inte alla, använder en betydligt mer "relaxed" modell).

Om tråd A skriver till minnescell A och sedan till B (i program order), det utan explicita barriärer, och en annan tråd sedan läser B och får det nya värdet garanterar TSO att om man då läser A från den tråden kommer man få det nya värdet. På Arm kan man även i det fallet potentiellt läsa det gamla värdet på A i frånvara av explicita barriärer.

Finns bibliotek som medvetet utnyttja TSO, inte helt oväntat finns prestandakritiska bibliotek från Intel som gör detta. Att korrekt översätta det till ARM64 blir inte effektivt om CPUn inte har möjlighet att aktivera TSO (vilket Apple Silicon verkar göra när den kör i kontext av Rosetta 2).

Mer vanligt är nog att det egentligen är race-condition buggar som råkar fungera alt. gör race-bugg:en tillräckligt osannolik när man kör på TSO. På en CPU med en mer relaxed konsistensmodell smäller det istället direkt...

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Du har helt rätt i att spekulativ körning och OoO är två ortogonala koncept.

Fattar inte denna sårbarhet tillräckligt i detalj, men i flera andra fall och specifikt i Spectre är både spekulativ körning och OoO ett krav för att trigga problemet.

Så egentligen ska man säga både OoO och spekulativ körning. Men i praktiken är OoO meningslöst utan spekulativ körning, så det senare är underförstått och många av de här buggarna kommer av kombinationen av dessa två.

Enda OoO CPU jag kunde hitta som inte också har spekulativ körning är den första CPU som använde Tomasulos algoritm på mitten av 1960-talet. OoO började användas först på 90-talet i någon större utsträckning, det efter att in-order designer redan börjat med spekulativ körning.

För in-order designer finns varianter både med och utan spekulativ körning. När Spectre presterandes var ett frågetecken huruvida Arms moderna in-order designer, som har spekulativ körning, var påverkade. De är inte påverkade, däremot är Arms OoO designer påverkade precis som alla moderna OoO designer (som alla också använder spekulativ körning).

Så åter igen: du har rätt att det är separata koncept, men i praktiken betyder "djupare OoO" också både mer och fler varianter av spekulativ körning. Utan det senare vore det helt hopplöst att utnyttja potentialen hos OoO, speciellt i en design som Apple Silicon som både är extremt "bred" och har ett enormt "out-of-order" fönster att utnyttja.

Edit: och bara för att understryka hur komplext det hela är om man försöker få med alla detaljer är detta ett bra exempel

"x86 är enbart OoO under väldigt specifika situationer vilket gör att många som skriver låsfria algoritmer under x86 plötsligt ser dem crash and burn på en ARM"

Detta har varken med spekulativ körning eller OoO att göra. Det har att göra med minneskonsistensmodell.

x86 implementerar en modell som kallas Total Store Order (TSO) medan Arm (likt de flesta RISC:ar, men inte alla, använder en betydligt mer "relaxed" modell).

Om tråd A skriver till minnescell A och sedan till B (i program order), det utan explicita barriärer, och en annan tråd sedan läser B och får det nya värdet garanterar TSO att om man då läser A från den tråden kommer man få det nya värdet. På Arm kan man även i det fallet potentiellt läsa det gamla värdet på A i frånvara av explicita barriärer.

Finns bibliotek som medvetet utnyttja TSO, inte helt oväntat finns prestandakritiska bibliotek från Intel som gör detta. Att korrekt översätta det till ARM64 blir inte effektivt om CPUn inte har möjlighet att aktivera TSO (vilket Apple Silicon verkar göra när den kör i kontext av Rosetta 2).

Mer vanligt är nog att det egentligen är race-condition buggar som råkar fungera alt. gör race-bugg:en tillräckligt osannolik när man kör på TSO. På en CPU med en mer relaxed konsistensmodell smäller det istället direkt...

Fast minneskonsistenmodellen är ju pga OoO, det som skiljer är att x86 är OoO inom samma kärna (i majoriteten av fallen) medan t.ex ARM är OoO mellan kärnor.

Att man kan ha en ren OoO och en ren spekulativ CPU innebär inte att jag menade att sådana fanns ;), båda ger ju prestandafördelar så att göra bara det ena eller det andra vore ju korkat (tills man upptäckte problemen med spekulationen då förstås) eftersom man då skulle tappa prestanda.

Det enda som jag pekar på är att det ena inte är ett krav för det andra och att de problem som vi ser idag beror på spekulationen isig och inte på OoO oavsett hur pass mycket som OoO-delen vinner på spekulationen.

Båda är ju som sagt tekniker för att hålla pipelinen så full som möjligt, OoO gör det genom att optimera loads och stores från RAM och spekulationen gör det genom att exekvera kod i lediga pipes som annars inte skulle kunna användas i hopp om att resultatet faktiskt kommer att behövas i framtiden.

Spectre kräver inte OoO för att fungera, dock eftersom spekulationen görs före den koden ens var tänkt att köras (eller ens ej) så blir ju de minnesåtkomster som den exekveringen gör per definition out of order, men det är inte del av OoO-schedulern i CPU:n utan påtvingad av spekulationen, vilket gör att minne dras in till (eller kastas ut ur) cachen som aldrig borde ha gjort det.

Visa signatur

|Ryzen 5800x3d|RX 7900XTX Hellhound|Asus Prime X370 Pro|32GiB Corsair 2400MHz CL16 Vengeance|Corsair HX1000i|Fractal Define R5|LG 45GR95QE|Corsair K100|Razer DeathAdder V3 Pro|Ubuntu 23.10|

Permalänk
Medlem

@Yoshman
En eloge till dig för dessa ständiga långa redogörelser, Kommentarerna är intressantare än artikeln (och artiklarna) i sig 🙂👍

Permalänk
Medlem

Verkar gå att avaktivera DMP även för M1 och M2 för att skapa en fix på detta. Så tursamt nog verkar inte problemet vara olösligt frågan är bara hur mycket apple måste fixa för att inte prestandan ska bli alltför lidande.

https://gofetch.fail/