Na zahrnutie do budúcej vetvy jadra Linux 6.13 bol navrhnutý patch s prepracovanou implementáciou algoritmu na zisťovanie kontrolného súčtu CRC32C. Kód implementácie CRC32C bol zmenšený približne 10-krát (z 4546 na 418 bajtov). Pri vypnutej ochrane retpoline pred útokmi triedy Spectre dosahuje nárast výkonu pri použití novej implementácie 11.8% na procesoroch AMD Zen 2, 6.4% na Intel Emerald Rapids a 4.8% na Intel Haswell. Pri zapnutej ochrane retpoline je nárast výkonu výraznejší a dosahuje 66.8% na systémoch s procesormi Intel Emerald Rapids, 35.0% na Intel Haswell a 29.5% na AMD Zen 2. retpoline enabled | 512 | 833 | 1024 | 2000 | 3173 | 4096 | ———————+——-+——-+——-+—— +——-+——-+ Intel Haswell | 35.0% | 20.7% | 17.8% | 9.7% | -0.2% | 4.4% | Intel Emerald Rapids | 66.8% | 45.2% | 36.3% | 19.3% | 0.0% | 5.4% | AMD Zen 2 | 29.5% | 17.2% | 13.5% | 8.6% | -0.5% | 2.8% | retpoline disabled: | 512 | 833 | 1024 | 2000 | 3173 | 4096 | ———————+——-+——-+——-+—— +——-+——-+ Intel Haswell | 3.3% | 4.8% | 4.5% | 0.9% | -2.9% | 0.3% | Intel Emerald Rapids | 7.5% | 6.4% | 5.2% | 2.3% | -0.0% | 0.6% | AMD Zen 2 | 11.8% | 1.4% | 0.2% | 1.3% | -0.9% | -0.2%
Pôvodná verzia CRC32C zahŕňala 128 rozvinutých cyklov (unroll), čo viedlo k pomerne veľkému kódu. Keďže moderné procesory s podporou vykonávania inštrukcií neporiadku (out of order) môžu vykonávať príkazy paralelne, sa takáto optimalizácia príkazov skoku v cykloch ukázala ako nadbytočná a viedla iba k neprimerane veľkému kódu. Namiesto 128 iterácií bol v novej verzii ponechaný len 4, čo nielenže značně zredukovalo objem kódu, ale aj urýchlilo vykonávanie operácie.
Zdroj: opennet.ru
