Skrivet av Höstregn:
Kan rekommendera läsning om aktiva interposers - speciellt "Enabling Interposer-based Disintegration of Multi-core Processors" (Kannan, Jerger, Loh). Med aktiv interposer kommer även 16st 4-kärniga ner i genomsnittslatenser på under 25ns.
We construct workload combinations based on their memory traffic intensity.For synthetic traffic patterns, we use uniform random traffic where we varied the ratio of coherence and memory requests injected into the network, but the majority of our results are reported with a 50-50 ratio between coherence and memory traffic. Other ratios did not result in significantly different behaviors.
Nuvarande Zen+ tror jag kommer ner i ~60ns med samsung b-die med tighta timings. Hittade bara en bild på core to core ratio för zen1 tyvärr
https://www.pcper.com/files/review/2017-06-16/latency-pingtimes.png
Hyfsat säker på att det inte är den latensen som är problem. Vore det fallet går det överhuvudtaget inte att förklara varför SKL-S (d.v.s. "vanliga" Skylake) presterar så mycket bättre i spel över SKL-X (HEDT/Xeon) som den ändå gör.
Det handlar i stället primärt om latensen när flera CPU-kärnor måste dela data, något som överhuvudtaget inte händer i program som skalar perfekt med CPU-kärnor medan det är en nödvändighet i t.ex. spel (vilket också gör det helt omöjligt för sådana program att någonsin skala perfekt med kärnor).
Ett litet exempel för att belysa skillnaden. Antag att det finns någon minnescell M som innehåller något flera CPU-kärnor måste läsa/skriva till och från.
Antag följande sekvens av händelser, initialt finns M enbart i RAM (d.v.s. inte i någon cache):
CPU#1 läser M
CPU#2 läser M
CPU#1 skriver M
Sekvensen ovan kommer i olika former hända varje gång något form av lås tas samt på annan delad data.
Hur hanteras detta på SKL-S, SKL-X resp. Zen?
SKL-S
Här är L1$/L2$ lokala per kärna och man använder en "mostly exclusive" policy, d.v.s. finns nästan alltid endera i L1$ eller L2$, men kan i speciella lägen finnas i båda.
L3$ är strikt inkluderade, så allt som finns i någon L1$/L2$ finns garanterat också i L3$.
M hämtas in, läggs i L3$ där även en notering görs om att CPU#1 kan ha en lokal kopia i L1/L2$. Data läggs sedan i L1$ och levereras
Här kommer man se noteringen i L3$, noteringen uppdateras med att även CPU#2 kan ha en lokal kopia. Data läses från L3$ och läggs i L1$
För att skriva data måste systemet säkerställa att eventuellt andra CPUers cachade värde invalideras innan skrivning, är väldigt enkelt här då data måste finnas i L3$ om någon CPU har en kopia i sin lokala L1/L2$, där finns ju även noteringen om att det räcker att invalidera eventuellt kopia hos CPU#2 (ingen annan kan ha en lokal kopia, dock kan CPU#2 redan kastat ut sin -> false positive möjlig, men spelar ingen roll och är osannolikt i praktiken).
SKL-X
Här är L1$/L2$ lokala per kärna och man använder en "mostly exclusive" policy, d.v.s. finns nästan alltid endera i L1$ eller L2$, men kan i speciella lägen finnas i båda.
L3$ är strikt exkluderande, så cachad data finns endera i L1$/L2$ eller I L3$.
M hämtas in, läggs direkt i L1$ och levereras
Redan här blir det problem, CPU#2 måste ställa en fråga om någon annan kärna har M cachad. Har ingen koll exakt hur det protokollet ser ut för SKL-X, men på något sätt kommer CPU#1 svara. Båda kärnorna kommer nu ha M i delat läge (read-only läge)
CPU#1 ser att M är i delat (read-only) läge. Den kan inte dra någon annan säker slutsats än att egentligen vilken kärna som helst kan ha M i sin lokala cache. Däremot vet den att data inte finns i L3$. Ändå en klart dyrare (högre latens) operation jämfört med SKL-S!!
Zen
Dokumentationen pekar på att L2$ är strikt inkluderande av L1$
L3$ är strikt exkluderande av L2$.
M hämtas in, läggs direkt i L2$ samt L1$ och levereras
Här skulle man kunna tänka sig att det blir identiskt med SKL-X, vilket är fallet fast med en liten twist. Zen har tydligen reserverat utrymme i L3$ för en lista likt den SKL-S har om vilka kärnor som kan ha en lokal kopia av M. Nackdel i detta läge då övergången från "data är exklusivt för mig" till "delar data med minst en annan kärna" har högre latens.
CPU#1 ser att M är i delat (read-only) läge. Här har däremot Zen en klar fördel mot SKL-X, CPU#1 ser direkt i sin CCX lokala L3$ vilken/vilka andra kärnor som kan tänkas ha en lokal kopia. Om den/de andra kärnorna ligger på ett annat CCX tar invalidiseringen lite extra tid, annars är det helt likvärdigt med SKL-S
Läser man ovan kan man ställa sig frågan: varför skulle någon välja exkluderade policy på delad cache? Det har ju högre latens!
Helt sant, inkluderande L3$ är optimalt i fall som t.ex. spel där flera CPU-kärnor kommer dela data.
Den uppenbara fördelen med en exkluderande cache är när förväntat last INTE delar data, t.ex. när man kör virtuella maskiner på en server och många andra server-laster. Här ger exkluderande policy en fördel då effektiv storlek på cachen är summan av L3$ och storleken på de aktiva kärnornas lokala cache.
Så för att svara på trådens fråga: nej tror inte man kommer matcha spelprestanda med Zen2 (förutsatt att det som avses är fall där GPU inte är flaskhals).
Zen är primärt en server-design, men man har ändå gjort en del desktop-specifika optimeringar. Så den är lite mitt emellan SKL-S och SKL-X ur optimeringssynpunkt. SKL-X tycker jag illustrerar rätt bra hur viktig cache-designen är, det är exakt samma mikroarkitektur som SKL-S + dubbelt så många minneskanaler. Ändå är SKL-S klart bättre i spel, även i5-modellerna är normalt snabbare trots lägre frekvenser jämfört med t.ex. i9-7900X.