Im Linux-Kernel wurde die Implementierung des CRC32C-Algorithmus optimiert

Für die Aufnahme in den zukünftigen Zweig des Linux-Kernels 6.13 wurde ein Patch mit einer überarbeiteten Implementierung des CRC32C-Prüfzahlenalgorithmus vorgeschlagen. Der Code der CRC32C-Implementierung wurde um etwa das 10-Fache reduziert (von 4546 auf 418 Bytes). Bei deaktiviertem Retpoline-Schutz vor Spectre-Angriffen beträgt der Leistungszuwachs mit der neuen Implementierung 11,8 % auf AMD Zen 2-Prozessoren, 6,4 % auf Intel Emerald Rapids und 4,8 % auf Intel Haswell. Bei aktiviertem Retpoline ist der Leistungszuwachs deutlicher und erreicht 66,8 % auf Systemen mit Intel Emerald Rapids-Prozessoren, 35,0 % auf Intel Haswell und 29,5 % auf 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% |

Die ursprüngliche Variante von CRC32C umfasste 128 unrollte Schleifen, was zu einem ziemlich großen Code führte. Da moderne Prozessoren mit der Unterstützung für die nicht sequenzielle Ausführung von Instruktionen (out of order) Befehle parallel ausführen können, erwies sich eine derartige Optimierung der Sprungbefehle in Schleifen als überflüssig und führte lediglich zu einem übermäßig großen Code. Anstelle von 128 Iterationen wurden im neuen Ansatz nur 4 beibehalten, was nicht nur den Codeumfang erheblich reduzierte, sondern auch die Ausführung der Operation beschleunigte.

Quelle: opennet.ru

60GB SSD 8Gb DDR4