Do przyszłej gałęzi jądra Linux 6.13 zaproponowano łatkę z przekształconą realizacją algorytmu obliczania sumy kontrolnej CRC32C. Kod realizacji CRC32C został zmniejszony około 10 razy (z 4546 do 418 bajtów). Przy wyłączonej ochronie retpoline przed atakami klasy Spectre, wzrost wydajności przy używaniu nowej realizacji osiąga 11,8% na procesorach AMD Zen 2, 6,4% na Intel Emerald Rapids i 4,8% na Intel Haswell. Przy włączonym retpoline wzrost wydajności jest bardziej zauważalny i wynosi 66,8% na systemach z procesorami Intel Emerald Rapids, 35,0% na Intel Haswell i 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% |
Pierwotna wersja CRC32C zawierała 128 rozwiniętych cykli (unroll), co prowadziło do dość dużego kodu. Ponieważ nowoczesne procesory z obsługą wykonywania instrukcji nie w kolejności (out of order) mogą wykonywać polecenia równolegle, podobna optymalizacja instrukcji skokowych w pętlach stała się zbędna i prowadziła jedynie do nadmiarowego kodu. Zamiast 128 iteracji w nowej wersji pozostawiono tylko 4, co nie tylko znacząco zmniejszyło objętość kodu, ale również przyspieszyło wykonanie operacji.
Źródło: opennet.ru
