0xDEADBEEF

RSS odkazy
««« »»»

Fingerprintování virtuálního procesoru

8. 8. 2022 #CPU #benchmark

Tento příběh začal jednoho horkého letního večera, kdy jsem se rozhodl vyzkoušet ultra-levnou VPS v ceně pod kilo za měsíc. Konkrétně jsem risknul to nejlacinější, co nabízí hukot.net za 90 korun per měsíc.

Nečekal jsem moc, ale přesto jsem byl překvapený. /proc/cpuinfo ukázal, že z myriády x86 rozšíření server nabízí maximálně SSE2 uvedené v roce 2000 spolu s nechvalně proslaveným Pentiem 4. To není nic, s čím bych se v roce 2022 zrovna chlubil. A poskytovatel serveru se nechlubí. Na webu píše, že prioritně používají Zen, Zen 2 a Xeon Silver1 procesory.

Tohle asi nebude jeden z nich. Kdyby ano, museli by ho doslova vykostit. Žádné AVX, popcnt, AES, BMI, dokonce ani stařičké SSE4.2 (a s ním instrukce pcmpistrm, k níž jsem si vybudoval nezdravý vztah). Šlo by o degradaci x86 ISA o celé dvě dekády.

Tak co jim tam ve skutečnosti běží? Hypervizor může virtuálnímu stroji lhát, jak se mu jen zlíbí. Nemůžu si být jistý tím, co o sobě počítač říká. Jsou to jen lži a propaganda. Věřit můžu jen tomu, co skutečně dělá. A v tomhle případě mám štěstí. Rozdílné generace mikroarchitektur se chovají trochu jinak a tyto rozdíly můžeme pozorovat. Nejde jen o velké věci – velikosti cache a OOO struktur – i specifické instrukce se liší svou latencí a propustností.

Pro účely hrubého rozpoznání se hodí bswap. Podle Agnera se na čipech Intelu chová dostatečně odlišně od nejnovějšího křemíku AMD. Zeny mají latence a propustnosti stejné, nehledě na velikost operandu. Na Intelu vykazují 64 bit operandy 2× horší latenci a propustnost, než je tomu v případě 32bitových.

Vyzbrojen touto znalostí můžu sestrojit 2 maličké programy pro testování klíčových metrik. Test latence volá bswap na jednom registru — výstup instrukce je vstupem následující a program je tím pádem serializovaný a limitován na IPC 1. Smyčka je dostatečně odrolována, aby režie dekrementace & skoku byla malá a co nejméně kontaminovala výsledky.

mov $200000000, %rax

loop:
bswap %r8
bswap %r8
bswap %r8
bswap %r8
bswap %r8
bswap %r8
bswap %r8
bswap %r8

dec %rax
jnz loop

Jako test propustnosti poslouží série bswapů na různých registrech, tady r8 – r15. CPU má volné ruce jich najednou spustit až 8 a program je limitován jen tím, kolik bswap instrukcí procesor dokáže rozjet v každém taktu.

(Navíc pokud v jedné iteraci provedu dva bswapy na každém registru, ten se vrátí na původní hodnotu. To má příjemný bonus, že můžu použít jakýkoli registr, se mi zlíbí, a nemusím se učit konvence x86 volání a pravidla o tom, kdo musí uložit jaký registr.)

mov $200000000, %rax

loop:
bswap %r8
bswap %r9
bswap %r10
bswap %r11
bswap %r12
bswap %r13
bswap %r14
bswap %r15

dec %rax
jnz loop

Stačí měřit jen relativní časy. Není potřeba znát počet taktů a instrukcí z perfu (virtuální stroj je stejně nenabízí).

Výsledky jsou následující.

Nejprve můj Intelí Haswell pro ověření hypotézy:

latencepropustnost
32b0.45 s0.23 s
64b0.9 s0.45 s

A teď onen neznámý procesor:

latencepropustnost
32b0.7 s1.2 s
64b2.2 s1.2 s

Tohle jsem nečekal. Propustnost stejná nehledě na 32/64 bit operandy jako u AMD, ale latence se nečekaně propadne 3× pro 64 bitů. Je na čase si zas projít Agnerovy instrukční tabulky a podívat se, jak je na tom bswap.

(Propustnost se udávaná jako inverzní hodnota a pak platí, stejně jako pro latenci, že menší je lepší. 0.25 značí 4 instrukce každý takt.)

              lat.   prop.
Zen 3:          1    0.25
Zen 2:          1    0.3
Zen 1:          1    0.25

Icelake, Cannon Lake, Coffee Lake, SkylakeX, Skylake, Broadwell, Haswell:
         32b    1    0.5
         64b    2    1

Ivy Bridge, Sandy Bridge:
         32b    1    1
         64b    2    1

Nehalem:
         32b    1    1
         64b    3    1

Chování odpovídá Nehalemu. Propustnost stejná pro obě šířky operandu, latence trojitá pro 64b registry. Ne zrovna, co bych čekal, musím říct. Nehalem představuje to nejlepší, co mohl rok 2008 nabídnout. Dva tisíce osm. Čtrnáct let nazpátek.

Tak to bychom měli. Teď zbývá jen jediná otázka: Je devadesát korun českých přiměřená částka za jedno jádro čtrnáct let staré mikroarchitektury? Pokud ne, vyhněte se nabídce hukot.net.


  1. Chlubit se použitím Xeonu Silver je k ničemu. Jde o marketingové jméno a nic neříká o použité generaci mikroarchitektury. Pokrývá všechno od Skylake po Ice Lake.
píše k47 (@kaja47, k47)