Wie implementiert man CRC32 unter Ausnutzung der Intel spezifischen Anweisungen?

9

Intel hat eine spezifische CRC32 Anweisung verfügbar im SSE4.2-Befehlssatz. Wie kann ich diese Anweisung nutzen, um CRC32-Berechnungen zu beschleunigen?

    
ecerulm 02.07.2015, 12:05
quelle

2 Antworten

7

Zunächst wird das CRC32 Anweisung des Intel dient zur Berechnung CRC-32C (dh verwendet ein anderes Polynom, dass regelmäßiger CRC32. Schauen Sie sich das Wikipedia CRC32 Eintrag)

Um Intels Hardwarebeschleunigung für CRC32C mit gcc zu verwenden, können Sie:

  1. Inline-Assemblersprache im C-Code über die asm -Anweisung
  2. Verwenden Sie intrinsics _mm_crc32_u8 , _mm_crc32_u16 , _mm_crc32_u32 oder _mm_crc32_u64 . Siehe Intel Intrinsics Führer für eine Beschreibung derjenigen für den Compiler von Intel icc , aber gcc auch setzt sie .

Dies ist, wie Sie es mit __mm_crc32_u8 tun würden, die ein Byte zu einem Zeitpunkt erfolgt, __mm_crc32_u64 wäre weitere Leistungsverbesserung geben, da es 8 Bytes zu einer Zeit in Anspruch nimmt.

%Vor%

Um dies zu kompilieren, musst du -msse4.2 in CFLAGS übergeben. Wie gcc -g -msse4.2 test.c sonst wird es sich über undefined reference to _mm_crc32_u8 beschweren.

Wenn Sie möchten, auf eine Ebene C-Implementierung zurück, wenn der Befehl nicht verfügbar in der Plattform ist, wo die ausführbare Datei ausgeführt wird Sie ifunc Attribut GCC verwenden können. Wie

%Vor%     
ecerulm 02.07.2015 12:05
quelle
1

Siehe diese Antwort für schnelle Hardware- und Software-Implementierungen von CRC-32C. Die Hardwareimplementierung führt effektiv drei crc32 -Anweisungen parallel für die Geschwindigkeit aus.

    
Mark Adler 02.07.2015 14:17
quelle

Tags und Links