Het artikel beschrijft de 'Assembly Hall of Shame', een project dat in tegenstelling tot normale prestatie-optimalisatie probeert de traagste individuele CPU-instructies te vinden. Via een x86-leaderboard wordt getoond hoe instructies zoals 'fxrstor64' extreme latenties kunnen bereiken (tot 62 seconden) door het laden van data uit MMIO-regio's terwijl de PCIe-fabric verzadigd wordt met concurrerend verkeer. Andere voorbeelden om vertraging te forceren zijn onder meer het triggeren van microcode assists via subnormale getallen en het uitvoeren van niet-uitgelijnde MMIO-reads vanaf GPU-registers.
Assembly Hall of Shame
Overzicht
🏆 Huidige Kampioenen 🏆
x86: fxrstor64
Strategie: Gebruik fxrstor64 om een FPU/MMX/XMM-status van 512 bytes te laden uit een MMIO-regio met hoge latentie in de PCIe-fabric. Terwijl de load wordt uitgevoerd, wordt de fabric "uitgehongerd": een vloot van hammer cores bestookt een andere MMIO-register met hoge latentie met strakke 4-byte reads. Dit verzadigt het PCIe root complex en endpoint met non-posted transacties, waardoor de 512-byte fxrstor64 van CPU 0 in de wachtrij moet staan achter al dat concurrerende verkeer.
- Deelnemer: AMD Ryzen 7 5800H
- Code:
```assembly ; CPU 0 — getimede instructie movl $0xfcc68830, %rsi fxrstor64 %rsi
; CPUs 1..N — hammer loop tegen een andere locatie met hoge latentie movl 0xfcc68858, %eax ```
- 🏆 Score: 198.002.498.236 cycli
- 🏆 Tijd: 62 seconden
Eervolle Vermeldingen
Een spec-schendende niet-uitgelijnde ymm0 load, die non-posted dword-transacties forceerde vanuit gestalde GPU-registers, werd gebruikt om het fundamentele ontwerp van System Management Mode te doorbreken in smiiiiiiiiiiiiiiii.
vmovdqu 0xfcc003b1, %ymm0
Regels
- Instructies mogen elke nodige voorbereiding (setup) gebruiken, maar slechts één enkele instructie komt in aanmerking voor een score.
- Gevangen (trapped), geëmuleerde of gevirtualiseerde instructies mogen alleen de trap timen, niet de handler.
- Instructies mogen niet onderbreekbaar zijn.
rep movs, pause, etc. zijn gediskwalificeerd.
- Tijden worden genormaliseerd op basis van de basisklokfrequentie van de CPU.
- Alle platforms moeten in hun fabrieksinstellingen staan — geen hardware-modificaties.
x86 Leaderboard
27. nop
- Strategie:
nop doet niets. Hij opent het leaderboard dienovereenkomstig.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
nop
- Score: 1 cyclus
- Tijd: 0 nanoseconden
26. nop16
- Strategie: Een reguliere
nop was te kort, maar hoe zorgen we dat "niets" langer duurt? Probeer een héél lange nop.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
data16 data16 data16 data16 data16 data16 data16 nopl 0x00000000(%%eax,%%eax,1)
- Score: 20 cycli
- Tijd: 7 nanoseconden
25. rdtsc
- Strategie: Gewoon een referentie-instructie om ons te oriënteren.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
rdtsc
- Score: 49 cycli
- Tijd: 18 nanoseconden
24. idiv
- Strategie: Gebruik een 128-bit dividend (
rdx:rax=2:0) met een kleine divisor om de quotiënt boven het plafond te duwen dat wordt opgelegd door sign-extension, waardoor het langste pad door de divider microcode wordt afgelegd.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly xorq %rax, %rax ; rax = 0 (lage 64 bits van dividend) movq $2, %rdx ; rdx = 2 (hoge 64 bits: volledig dividend = 2^65) movq $5, %rbx ; divisor → quotiënt = 2^65/5 ≈ 7.4×10^18 idivq %rbx ``
- Score: 77 cycli
- Tijd: 28 nanoseconden
23. enter
- Strategie: Gebruik de maximale nestingsdiepte (31) om 30 display-pointer loads en pushes door het microcode display-walk pad te forceren.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
enter $0, $31 (0 bytes toegewezen, nestingsdiepte 31 maximum)
- Score: 112 cycli
- Tijd: 41 nanoseconden
22. fldl
- Strategie: Probeer een kleine denormal om een FP microcode assist te triggeren.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly movabsq $0x0000000000000001, %rax movq %rax, -8(%rsp) fldl -8(%rsp) ``
- Score: 133 cycli
- Tijd: 49 nanoseconden
21. clflush
- Strategie: Zorg enkel dat de cache line "dirty" is.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
clflush (%rax) (rax -> dirty cache line resident in L3)
- Score: 165 cycli
- Tijd: 60 nanoseconden
20. fsin
- Strategie: Gebruik exponent
0x7ff om 'special value' processing in microcode te bereiken; positief/negatief, NaN/inf lijkt geen verschil te maken, we kiezen voor QNaN.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly movabsq $0x7fffffffffffffff, %rax movq %rax, -8(%rsp) fldl -8(%rsp) fsin ``
- Score: 257 cycli
- Tijd: 94 nanoseconden
19. mfence
- Strategie: Verzadig alle write-combining line-fill buffers met
movnti stores naar verschillende cache lines, waardoor mfence het volledige LFB schrijfpad naar de uncore moet legen voordat hij kan afsluiten.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly movnti %r9, 064(%rdi) ; ×16 verschillende cache lines — verzadig de write-combining LFBs ; … movnti %r9, 1564(%rdi) mfence ; moet alle openstaande LFB writes legen voor afsluiting ``
- Score: 326 cycli
- Tijd: 120 nanoseconden
18. mov cr3
- Strategie: Geen specifieke strategie voor nu, enkel controleren hoe lang het duurt om de TLB te invalideren.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
mov %rax, %cr3
- Score: 352 cycli
- Tijd: 110 nanoseconden
17. fadd
- Strategie: Raak het x87 FP microcode assist pad door een denormal source operand te gebruiken.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly fldl subnorm ; 1e-310: waarde < DBL_MIN, biased exponent = 0 faddl subnorm ; source is subnormal → FP microcode assist ``
- Score: 677 cycli
- Tijd: 249 nanoseconden
16. split lock
- Strategie: Lijn de lock-prefixed operand zo uit dat deze over de grens van de cache-line valt, waardoor de CPU gedwongen wordt de externe bus lock te activeren in plaats van het snelle MESI cache-coherence pad.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
lock xaddl %r9d, (%rdi) (split_ptr % 64 == 63 — dword overspant bytes 63 (lijn N) en 64–66 (lijn N+1))
- Score: 865 cycli
- Tijd: 319 nanoseconden
15. fdiv
- Strategie: Gebruik een subnormale divisor; de hardware draagt de controle over aan microcode assist, de assist normaliseert de operand, voert de deling uit en herstelt vervolgens de architecturale status.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly movabsq $0x3ff0000000000000, %rax ; 1.0 (normaal dividend) movq %rax, -8(%rsp) fldl -8(%rsp) ; ST(0) = 1.0 movabsq $0x0000002000000000, %rax ; 6.79e-313 (subnormale divisor) movq %rax, -8(%rsp) fdivl -8(%rsp) ; ST(0) = 1.0 / subnormal → FP assist ``
- Score: 883 cycli
- Tijd: 325 nanoseconden
14. cpuid
- Strategie: Gebruik rakefield om de CPUID leaves met de hoogste latentie te vinden.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly movl $6, %eax cpuid ``
- Score: 1248 cycli
- Tijd: 460 nanoseconden
13. rdrand
- Strategie: Voer uit in een strakke loop om de hardware entropy pool sneller leeg te maken dan deze kan worden bijgevuld, waardoor volgende calls moeten wachten tot de entropy bron hersteld is.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
rdrand %rax
- Score: 5.579 cycli
- Tijd: 2,057 microseconden
12. wrmsr
- Strategie: Gebruik project:nightshyft om MSR's met hoge latentie te identificeren.
MCG_CTL op Zen lijkt een winnaar: dit kan een microcode quiesce en synchronisatie zijn op MCA error banks over hardware-units, waarvan sommige mogelijk off-die zijn, wat fabric-level communicatie vereist in plaats van een eenvoudige lokale registerwrite.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
``assembly movl $0x17b, %ecx ; MCG_CTL wrmsr ``
- Score: 34.304 cycli
- Tijd: 10,742 microseconden
11. out
- Strategie: Richt je op een I/O-poort die over een NIC device register grens valt, waardoor het apparaat bij elke write zijn TX DMA engine moet quiescen.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
``assembly mov $0xf019, %dx outl %eax, %dx ``
- Score: 49.857 cycli
- Tijd: 15,580 microseconden
10. rdmsr
- Strategie: Gebruik project:nightshyft om model-specific-registers met hoge latentie te identificeren: VIA gebruikt een ongedocumenteerd register op
0x133 dat een extreem hoge responstijd geeft. Geen idee wat het doet.
- Deelnemer: VIA Eden Processor 800MHz
- Code:
``assembly movl $0x133, %ecx ; ongedocumenteerde MSR rdmsr ``
- Score: 161.602 cycli
- Tijd: 202,004 microseconden
9. wbinvd
- Strategie: Laad L1/L2/L3 caches volledig met dirty lines om een DRAM writeback van de gehele hiërarchie te forceren.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
wbinvd
- Score: 1.616.480 cycli
- Tijd: 506,165 microseconden
8. in
- Strategie: Richt je op een I/O-poort gekoppeld aan een ACPI PM block waar een niet-uitgelijnde 4-byte read decodeert naar meerdere non-posted loads vanaf de locatie van deze poort.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
``assembly mov $0x0413, %dx inl %dx, %eax ``
- Score: 12.524.415 cycli
- Tijd: 3,921769 milliseconden
7. mov
- Strategie: Gebruik mmiotic om deadspace met hoge latentie in de PCIe fabric te identificeren; raak een onbekend GPU register.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
movl 0xfcc003b0, %esi
- Score: 443.937.696 cycli
- Tijd: 139,010268 milliseconden
6. mov rax
- Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 8-byte MMIO read om twee dword register-toegangen te krijgen, wat technisch gezien niet is toegestaan maar wel werkt.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
movq 0xfcc003b0, %rax
- Score: 887.716.864 cycli
- Tijd: 277,971228 milliseconden
5. vmovdqu xmm
- Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 16-byte MMIO read om vier dword register-toegangen te krijgen, wat technisch gezien niet is toegestaan maar wel werkt.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
vmovdqu 0xfcc003b0, %xmm0
- Score: 1.774.555.776 cycli
- Tijd: 555,664133 milliseconden
4. vmovdqu ymm
- Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 32-byte MMIO read om acht dword register-toegangen te krijgen, wat nog steeds technisch gezien niet is toegestaan maar wel werkt.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
vmovdqu 0xfcc003b0, %ymm0
- Score: 3.549.079.296 cycli
- Tijd: 1,111345034 s
3. vmovdqu ymm (niet-uitgelijnd)
- Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 32-byte niet-uitgelijnde MMIO read om negen dword register-toegangen te krijgen, wat nog minder is toegestaan dan de uitgelijnde versie, maar toch werkt.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
vmovdqu 0xfcc003b1, %ymm0
- Score: 4.453.212.256 cycli
- Tijd: 1,394428818 seconden
2. fxrstor64 (baseline)
- Strategie: Gebruik mmiotic om deadspace met hoge latentie in de PCIe fabric te identificeren, isoleer een regio nabij 0 en offset de status om MXCSR-corruptie te voorkomen (mogelijk VGA buffer?). Gebruik
fxrstor64 om een FPU/MMX/XMM-status van 512 bytes vanuit MMIO te laden, waardoor de CPU 512 bytes aan I/O-transacties via de traagste beschikbare memory aperture moet verwerken.
- Deelnemer: AMD Ryzen 7 5800H
- Code:
``assembly movl $0xfcc68830, %rsi fxrstor64 %rsi ``
- Score: 74.584.168.512 cycli
- Tijd: 23,354502677 seconden
1. 🏆 fxrstor64 🏆
- Strategie: Breid de
fxrstor64 (baseline) uit door de fabric uit te hongeren terwijl de load in flight is — een vloot van hammer cores bestookt een ander MMIO-register met hoge latentie met strakke 4-byte reads. Dit verzadigt het PCIe root complex en endpoint met non-posted transacties, waardoor de 512-byte fxrstor64 van CPU 0 in de wachtrij moet staan achter al dat concurrerende verkeer.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
```assembly ; CPU 0 — getimede instructie movl $0xfcc68830, %rsi fxrstor64 %rsi
; CPUs 1..N — hammer loop tegen een andere locatie met hoge latentie movl 0xfcc68858, %eax ```
- 🏆 Score: 198.002.498.236 cycli
- 🏆 Tijd: 62 seconden
??. xrstor64 (AMX, MMIO)
- Strategie: Maak gebruik van de uitgebreide AVX-status in Sapphire Rapids met de MMIO-aanpak van
fxrstor64: het xsave statusgebied is 8KB versus 512 bytes (16x groter) → 1.000.000.000.000 cycli.
- Deelnemer: TODO
- Code:
``assembly ; XCR0 moet AMX componenten inschakelen (bits 17-18); statusgebied ~8KB xrstor64 (%rsi) ; rsi -> MMIO regio, zelfde techniek als fxrstor64 ``
ARM Leaderboard
T.B.D. (Nog te bepalen)
RISC-V Leaderboard
T.B.D. (Nog te bepalen)
***
Auteur: De assembly hall-of-shame is een onderzoeksinitiatief van Christopher Domas (@xoreaxeaxeax).
Assembly Hall of Shame
Overzicht
🏆 Huidige Kampioenen 🏆
x86: fxrstor64
Strategie: Gebruik fxrstor64 om een FPU/MMX/XMM-status van 512 bytes te laden uit een MMIO-regio met hoge latentie in de PCIe-fabric. Terwijl de load wordt uitgevoerd, wordt de fabric "uitgehongerd": een vloot van hammer cores bestookt een andere MMIO-register met hoge latentie met strakke 4-byte reads. Dit verzadigt het PCIe root complex en endpoint met non-posted transacties, waardoor de 512-byte fxrstor64 van CPU 0 in de wachtrij moet staan achter al dat concurrerende verkeer.
- Deelnemer: AMD Ryzen 7 5800H
- Code:
```assembly ; CPU 0 — getimede instructie movl $0xfcc68830, %rsi fxrstor64 %rsi
; CPUs 1..N — hammer loop tegen een andere locatie met hoge latentie movl 0xfcc68858, %eax ```
- 🏆 Score: 198.002.498.236 cycli
- 🏆 Tijd: 62 seconden
Eervolle Vermeldingen
Een spec-schendende niet-uitgelijnde ymm0 load, die non-posted dword-transacties forceerde vanuit gestalde GPU-registers, werd gebruikt om het fundamentele ontwerp van System Management Mode te doorbreken in smiiiiiiiiiiiiiiii.
vmovdqu 0xfcc003b1, %ymm0
Regels
- Instructies mogen elke nodige voorbereiding (setup) gebruiken, maar slechts één enkele instructie komt in aanmerking voor een score.
- Gevangen (trapped), geëmuleerde of gevirtualiseerde instructies mogen alleen de trap timen, niet de handler.
- Instructies mogen niet onderbreekbaar zijn.
rep movs, pause, etc. zijn gediskwalificeerd.
- Tijden worden genormaliseerd op basis van de basisklokfrequentie van de CPU.
- Alle platforms moeten in hun fabrieksinstellingen staan — geen hardware-modificaties.
x86 Leaderboard
27. nop
- Strategie:
nop doet niets. Hij opent het leaderboard dienovereenkomstig.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
nop
- Score: 1 cyclus
- Tijd: 0 nanoseconden
26. nop16
- Strategie: Een reguliere
nop was te kort, maar hoe zorgen we dat "niets" langer duurt? Probeer een héél lange nop.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
data16 data16 data16 data16 data16 data16 data16 nopl 0x00000000(%%eax,%%eax,1)
- Score: 20 cycli
- Tijd: 7 nanoseconden
25. rdtsc
- Strategie: Gewoon een referentie-instructie om ons te oriënteren.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
rdtsc
- Score: 49 cycli
- Tijd: 18 nanoseconden
24. idiv
- Strategie: Gebruik een 128-bit dividend (
rdx:rax=2:0) met een kleine divisor om de quotiënt boven het plafond te duwen dat wordt opgelegd door sign-extension, waardoor het langste pad door de divider microcode wordt afgelegd.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly xorq %rax, %rax ; rax = 0 (lage 64 bits van dividend) movq $2, %rdx ; rdx = 2 (hoge 64 bits: volledig dividend = 2^65) movq $5, %rbx ; divisor → quotiënt = 2^65/5 ≈ 7.4×10^18 idivq %rbx ``
- Score: 77 cycli
- Tijd: 28 nanoseconden
23. enter
- Strategie: Gebruik de maximale nestingsdiepte (31) om 30 display-pointer loads en pushes door het microcode display-walk pad te forceren.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
enter $0, $31 (0 bytes toegewezen, nestingsdiepte 31 maximum)
- Score: 112 cycli
- Tijd: 41 nanoseconden
22. fldl
- Strategie: Probeer een kleine denormal om een FP microcode assist te triggeren.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly movabsq $0x0000000000000001, %rax movq %rax, -8(%rsp) fldl -8(%rsp) ``
- Score: 133 cycli
- Tijd: 49 nanoseconden
21. clflush
- Strategie: Zorg enkel dat de cache line "dirty" is.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
clflush (%rax) (rax -> dirty cache line resident in L3)
- Score: 165 cycli
- Tijd: 60 nanoseconden
20. fsin
- Strategie: Gebruik exponent
0x7ff om 'special value' processing in microcode te bereiken; positief/negatief, NaN/inf lijkt geen verschil te maken, we kiezen voor QNaN.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly movabsq $0x7fffffffffffffff, %rax movq %rax, -8(%rsp) fldl -8(%rsp) fsin ``
- Score: 257 cycli
- Tijd: 94 nanoseconden
19. mfence
- Strategie: Verzadig alle write-combining line-fill buffers met
movnti stores naar verschillende cache lines, waardoor mfence het volledige LFB schrijfpad naar de uncore moet legen voordat hij kan afsluiten.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly movnti %r9, 064(%rdi) ; ×16 verschillende cache lines — verzadig de write-combining LFBs ; … movnti %r9, 1564(%rdi) mfence ; moet alle openstaande LFB writes legen voor afsluiting ``
- Score: 326 cycli
- Tijd: 120 nanoseconden
18. mov cr3
- Strategie: Geen specifieke strategie voor nu, enkel controleren hoe lang het duurt om de TLB te invalideren.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
mov %rax, %cr3
- Score: 352 cycli
- Tijd: 110 nanoseconden
17. fadd
- Strategie: Raak het x87 FP microcode assist pad door een denormal source operand te gebruiken.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly fldl subnorm ; 1e-310: waarde < DBL_MIN, biased exponent = 0 faddl subnorm ; source is subnormal → FP microcode assist ``
- Score: 677 cycli
- Tijd: 249 nanoseconden
16. split lock
- Strategie: Lijn de lock-prefixed operand zo uit dat deze over de grens van de cache-line valt, waardoor de CPU gedwongen wordt de externe bus lock te activeren in plaats van het snelle MESI cache-coherence pad.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
lock xaddl %r9d, (%rdi) (split_ptr % 64 == 63 — dword overspant bytes 63 (lijn N) en 64–66 (lijn N+1))
- Score: 865 cycli
- Tijd: 319 nanoseconden
15. fdiv
- Strategie: Gebruik een subnormale divisor; de hardware draagt de controle over aan microcode assist, de assist normaliseert de operand, voert de deling uit en herstelt vervolgens de architecturale status.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly movabsq $0x3ff0000000000000, %rax ; 1.0 (normaal dividend) movq %rax, -8(%rsp) fldl -8(%rsp) ; ST(0) = 1.0 movabsq $0x0000002000000000, %rax ; 6.79e-313 (subnormale divisor) movq %rax, -8(%rsp) fdivl -8(%rsp) ; ST(0) = 1.0 / subnormal → FP assist ``
- Score: 883 cycli
- Tijd: 325 nanoseconden
14. cpuid
- Strategie: Gebruik rakefield om de CPUID leaves met de hoogste latentie te vinden.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
``assembly movl $6, %eax cpuid ``
- Score: 1248 cycli
- Tijd: 460 nanoseconden
13. rdrand
- Strategie: Voer uit in een strakke loop om de hardware entropy pool sneller leeg te maken dan deze kan worden bijgevuld, waardoor volgende calls moeten wachten tot de entropy bron hersteld is.
- Deelnemer: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
- Code:
rdrand %rax
- Score: 5.579 cycli
- Tijd: 2,057 microseconden
12. wrmsr
- Strategie: Gebruik project:nightshyft om MSR's met hoge latentie te identificeren.
MCG_CTL op Zen lijkt een winnaar: dit kan een microcode quiesce en synchronisatie zijn op MCA error banks over hardware-units, waarvan sommige mogelijk off-die zijn, wat fabric-level communicatie vereist in plaats van een eenvoudige lokale registerwrite.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
``assembly movl $0x17b, %ecx ; MCG_CTL wrmsr ``
- Score: 34.304 cycli
- Tijd: 10,742 microseconden
11. out
- Strategie: Richt je op een I/O-poort die over een NIC device register grens valt, waardoor het apparaat bij elke write zijn TX DMA engine moet quiescen.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
``assembly mov $0xf019, %dx outl %eax, %dx ``
- Score: 49.857 cycli
- Tijd: 15,580 microseconden
10. rdmsr
- Strategie: Gebruik project:nightshyft om model-specific-registers met hoge latentie te identificeren: VIA gebruikt een ongedocumenteerd register op
0x133 dat een extreem hoge responstijd geeft. Geen idee wat het doet.
- Deelnemer: VIA Eden Processor 800MHz
- Code:
``assembly movl $0x133, %ecx ; ongedocumenteerde MSR rdmsr ``
- Score: 161.602 cycli
- Tijd: 202,004 microseconden
9. wbinvd
- Strategie: Laad L1/L2/L3 caches volledig met dirty lines om een DRAM writeback van de gehele hiërarchie te forceren.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
wbinvd
- Score: 1.616.480 cycli
- Tijd: 506,165 microseconden
8. in
- Strategie: Richt je op een I/O-poort gekoppeld aan een ACPI PM block waar een niet-uitgelijnde 4-byte read decodeert naar meerdere non-posted loads vanaf de locatie van deze poort.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
``assembly mov $0x0413, %dx inl %dx, %eax ``
- Score: 12.524.415 cycli
- Tijd: 3,921769 milliseconden
7. mov
- Strategie: Gebruik mmiotic om deadspace met hoge latentie in de PCIe fabric te identificeren; raak een onbekend GPU register.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
movl 0xfcc003b0, %esi
- Score: 443.937.696 cycli
- Tijd: 139,010268 milliseconden
6. mov rax
- Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 8-byte MMIO read om twee dword register-toegangen te krijgen, wat technisch gezien niet is toegestaan maar wel werkt.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
movq 0xfcc003b0, %rax
- Score: 887.716.864 cycli
- Tijd: 277,971228 milliseconden
5. vmovdqu xmm
- Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 16-byte MMIO read om vier dword register-toegangen te krijgen, wat technisch gezien niet is toegestaan maar wel werkt.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
vmovdqu 0xfcc003b0, %xmm0
- Score: 1.774.555.776 cycli
- Tijd: 555,664133 milliseconden
4. vmovdqu ymm
- Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 32-byte MMIO read om acht dword register-toegangen te krijgen, wat nog steeds technisch gezien niet is toegestaan maar wel werkt.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
vmovdqu 0xfcc003b0, %ymm0
- Score: 3.549.079.296 cycli
- Tijd: 1,111345034 s
3. vmovdqu ymm (niet-uitgelijnd)
- Strategie: Zoek in de MMIO-ruimte naar de traagste registers in de PCIe fabric; raak een onbekend GPU register. Gebruik een 32-byte niet-uitgelijnde MMIO read om negen dword register-toegangen te krijgen, wat nog minder is toegestaan dan de uitgelijnde versie, maar toch werkt.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
vmovdqu 0xfcc003b1, %ymm0
- Score: 4.453.212.256 cycli
- Tijd: 1,394428818 seconden
2. fxrstor64 (baseline)
- Strategie: Gebruik mmiotic om deadspace met hoge latentie in de PCIe fabric te identificeren, isoleer een regio nabij 0 en offset de status om MXCSR-corruptie te voorkomen (mogelijk VGA buffer?). Gebruik
fxrstor64 om een FPU/MMX/XMM-status van 512 bytes vanuit MMIO te laden, waardoor de CPU 512 bytes aan I/O-transacties via de traagste beschikbare memory aperture moet verwerken.
- Deelnemer: AMD Ryzen 7 5800H
- Code:
``assembly movl $0xfcc68830, %rsi fxrstor64 %rsi ``
- Score: 74.584.168.512 cycli
- Tijd: 23,354502677 seconden
1. 🏆 fxrstor64 🏆
- Strategie: Breid de
fxrstor64 (baseline) uit door de fabric uit te hongeren terwijl de load in flight is — een vloot van hammer cores bestookt een ander MMIO-register met hoge latentie met strakke 4-byte reads. Dit verzadigt het PCIe root complex en endpoint met non-posted transacties, waardoor de 512-byte fxrstor64 van CPU 0 in de wachtrij moet staan achter al dat concurrerende verkeer.
- Deelnemer: AMD Ryzen 7 5800H with Radeon Graphics (Trigkey S5)
- Code:
```assembly ; CPU 0 — getimede instructie movl $0xfcc68830, %rsi fxrstor64 %rsi
; CPUs 1..N — hammer loop tegen een andere locatie met hoge latentie movl 0xfcc68858, %eax ```
- 🏆 Score: 198.002.498.236 cycli
- 🏆 Tijd: 62 seconden
??. xrstor64 (AMX, MMIO)
- Strategie: Maak gebruik van de uitgebreide AVX-status in Sapphire Rapids met de MMIO-aanpak van
fxrstor64: het xsave statusgebied is 8KB versus 512 bytes (16x groter) → 1.000.000.000.000 cycli.
- Deelnemer: TODO
- Code:
``assembly ; XCR0 moet AMX componenten inschakelen (bits 17-18); statusgebied ~8KB xrstor64 (%rsi) ; rsi -> MMIO regio, zelfde techniek als fxrstor64 ``
ARM Leaderboard
T.B.D. (Nog te bepalen)
RISC-V Leaderboard
T.B.D. (Nog te bepalen)
***
Auteur: De assembly hall-of-shame is een onderzoeksinitiatief van Christopher Domas (@xoreaxeaxeax).