Se ha propuesto un parche con una implementación revisada del algoritmo de cálculo de la suma de verificación CRC32C para incluirlo en la próxima rama del núcleo Linux 6.13. El código de la implementación de CRC32C se ha reducido aproximadamente 10 veces (de 4546 a 418 bytes). Con la protección retpoline desactivada contra ataques de clase Spectre, el aumento en el rendimiento al utilizar la nueva implementación alcanza el 11.8% en los procesadores AMD Zen 2, 6.4% en Intel Emerald Rapids y 4.8% en Intel Haswell. Al activar retpoline, el aumento de rendimiento se hace más notable y alcanza el 66.8% en sistemas con procesadores Intel Emerald Rapids, 35.0% en Intel Haswell y 29.5% en AMD Zen 2. retpoline habilitado | 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 deshabilitado: | 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 versión original de CRC32C incluía 128 ciclos desplegados (unroll), lo que resultó en un código bastante grande. Dado que los procesadores modernos con soporte para la ejecución de instrucciones fuera de orden (out of order) pueden ejecutar comandos en paralelo, dicha optimización de los saltos en ciclos resultó excesiva y solo producía un código demasiado grande. En lugar de 128 iteraciones, en la nueva versión se dejaron solo 4, lo que no solo redujo drásticamente el tamaño del código, sino que también aceleró la ejecución de la operación.
Fuente: opennet.ru
