Om opgenomen te worden in de toekomstige kernelversie Linux 6.13 is er een patch voorgesteld met een herziende implementatie van het CRC32C-checksumalgoritme. De code voor de implementatie van CRC32C is met ongeveer 10 keer verminderd (van 4546 naar 418 bytes). Bij uitgeschakelde retpoline-bescherming tegen Spectre-aanvallen bedraagt de prestatiewinst met de nieuwe implementatie 11,8% op AMD Zen 2-processors, 6,4% op Intel Emerald Rapids en 4,8% op Intel Haswell. Bij ingeschakelde retpoline is de prestatiewinst aanzienlijker en bereikt deze 66,8% op systemen met Intel Emerald Rapids-processors, 35,0% op Intel Haswell en 29,5% op AMD Zen 2. retpoline ingeschakeld | 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 uitgeschakeld: | 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% |
De oorspronkelijke versie van CRC32C bevatte 128 uitgepakte lussen (unroll), wat leidde tot behoorlijk veel code. Aangezien moderne processors met ondersteuning voor uitgestelde instructies (out of order) commando's parallel kunnen uitvoeren, bleek een dergelijke optimalisatie van lussen overbodig en leidde deze alleen maar tot een overmatig grote code. In de nieuwe versie zijn van de 128 iteraties er slechts 4 overgebleven, wat niet alleen de codegrootte aanzienlijk heeft verkleind, maar ook de uitvoering van de operatie heeft versneld.
Bron: opennet.ru
