以便包含在未来的内核分支中 Linux 6.13 版本提供了一个补丁,其中重新实现了 CRC32C 校验和计算算法。CRC32C 的实现代码减少了约 10 倍(从 4546 字节减少到 418 字节)。在禁用 Spectre 攻击的 retpoline 保护后,使用新实现后,AMD Zen 2 处理器的性能提升可达 11.8%,Intel Emerald Rapids 处理器为 6.4%,Intel Haswell 处理器为 4.8%。启用 retpoline 后,性能提升更加显著,Intel Emerald Rapids 处理器为 66.8%,Intel Haswell 处理器为 35.0%,AMD Zen 2 处理器为 29.5%。启用 retpoline | 512 | 833 | 1024 | 2000 | 3173 | 4096 | ——————+——-+——-+——-+—— +——-+——-+ Intel Haswell | 35.0% | 20.7% | 17.8% | 9.7% | -0.2% | 4.4% | 英特尔 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 已禁用: | 512 | 833 | 1024 | 2000 | 3173 | 4096 | ——————+——-+——-+——-+—— +——-+——-+ 英特尔 Haswell | 3.3% | 4.8% | 4.5% | 0.9% | -2.9% | 0.3% | 英特尔 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% |
最初的 CRC32C 包含 128 个展开的循环,这导致了相当庞大的代码库。 现代处理器 尽管乱序执行支持允许指令并行执行,但这种对循环中分支指令的优化是多余的,并且导致代码过大。新版本仅使用 4 次迭代,而不是之前的 128 次,这不仅显著减小了代码大小,而且提高了运行速度。
来源: opennet.ru
