Pentru a fi inclus în viitoarea ramură a nucleului Linux 6.13, a fost propus un patch cu o implementare refăcută a algoritmului de calculare a sumei de verificare CRC32C. Codul pentru implementarea CRC32C a fost redus de aproximativ 10 ori (de la 4546 la 418 octeți). Când protecția retpoline împotriva atacurilor de tip Spectre este dezactivată, creșterea performanței utilizând noua implementare ajunge la 11.8% pe procesoarele AMD Zen 2, 6.4% — Intel Emerald Rapids și 4.8% — Intel Haswell. Când retpoline este activat, creșterea performanței devine mai vizibilă, atingând 66.8% pe sistemele cu procesoare Intel Emerald Rapids, 35.0% — Intel Haswell și 29.5% — 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% |
Varianta inițială a CRC32C includea 128 de iterații desfășurate (unroll), ceea ce ducea la un cod destul de mare. Deoarece procesoarele moderne cu suport pentru execuția instrucțiunilor neordonate (out of order) pot executa comenzi simultan, o astfel de optimizare a instrucțiunilor de salt din bucle s-a dovedit a fi redundantă și a dus doar la un cod excesiv de mare. În loc de 128 de iterații, noua variantă a păstrat doar 4, ceea ce nu numai că a redus semnificativ volumul de cod, dar a accelerat și execuția operațiunii.
Sursa: opennet.ro
