A Google-nál dolgozó Eric Biggers az elmúlt években több komoly Intel/AMD x86_64 optimalizáción is dolgozott. Különösen sokat foglalkozott a Linux kernel kriptográfiai kódjának AVX-512 optimalizálásával, ami a közelmúltban több látványos kernel-szintű fejlesztést hozott. Most egy újabb ígéretes AVX-512 optimalizációval állt elő, ezúttal a szoftveres RAID kódhoz.
Biggers egy AVX-512-re optimalizált xor_gen() függvényt írt a RAID kódhoz. A Linux kernel xor_gen() függvénye a paritásblokkok előállítására és ellenőrzésére szolgál, például RAID5/RAID6 esetén. A mostani javítócsomaghoz fűzött megjegyzésében részletezte a megvalósítást, és hogy az AMD Zen 4 és újabb, Intel Sapphire Rapids és újabb, illetve kliens oldalon az Intel Rocket Lake vagy a közelgő Nova Lake generációkat célozza.
„Adjunk hozzá egy xor_gen() megvalósítást AVX-512 használatával.
512 bites vektorokat, vagyis ZMM regisztereket használ. Emellett a vpternlogq utasítást is beveti, ahol lehet, három bemenetű XOR műveletekhez.
Az x86_64 CPU-kon akkor engedélyezett, ha elérhető az AVX512F és nem áll fenn a PREFER_YMM. A gyakorlatban ez a következőket jelenti:
- AMD Zen 4 és újabb (kliens és szerver)
- Intel Sapphire Rapids és újabb (szerver)
- Intel Rocket Lake (kliens)
- Intel Nova Lake és újabb (kliens)
A !PREFER_YMM feltétel kizárja az Intel Skylake Server és Intel Ice Lake régebbi AVX-512 megvalósításait. Ezek ugyan futtatni tudnák ezt a kódot, de ismerten túlságosan agresszíven visszaveszik az órajelet, ha ZMM regisztereket használnak. Ugyanezt az elvet követi a kriptográfiai és a CRC kód is.”
Az igazán izgalmas rész az AVX-512-es megvalósításból kihozott teljesítmény. Egy AMD Ryzen 9 9950X (Zen 5) asztali processzoron végzett tesztekben 19–41% közötti gyorsulást mértek:
Ez kifejezetten látványos fejlesztés, főleg ha figyelembe vesszük azokat az AVX-512 optimalizációkat is, amelyeket Eric Biggers az utóbbi időben már beletett a kódba. Remélhető, hogy ez a javítócsomag a közeljövőben bekerül a mainline kernel-ba.

