È stato proposto un patch, per l'inclusione nella futura versione del kernel Linux 6.13, che rielabora l'algoritmo di calcolo del checksum CRC32C. Il codice di implementazione del CRC32C è stato ridotto di circa 10 volte (da 4546 a 418 byte). Con la protezione retpoline disattivata contro gli attacchi di tipo Spectre, l'aumento delle prestazioni con la nuova implementazione raggiunge l'11.8% sui processori AMD Zen 2, il 6.4% su Intel Emerald Rapids e il 4.8% su Intel Haswell. Con retpoline attivato, l'aumento delle prestazioni è più significativo, raggiungendo il 66.8% sui sistemi con processori Intel Emerald Rapids, il 35.0% su Intel Haswell e il 29.5% su 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% |
La versione originale del CRC32C includeva 128 cicli srotolati (unroll), il che portava a un codice piuttosto grande. Poiché i processori moderni Con il supporto per l'esecuzione di istruzioni non in ordine (out of order), possono eseguire comandi in parallelo. Questa ottimizzazione dei comandi di salto nei cicli si è rivelata superflua e ha portato solo a un codice eccessivamente lungo. Invece di 128 iterazioni, nella nuova versione sono state mantenute solo 4, il che non solo ha notevolmente ridotto il volume del codice, ma ha anche accelerato l'esecuzione dell'operazione.
Fonte: opennet.ru
