Intel, SSE4.2 komut setinde belirli bir CRC32
instruction ürününe sahiptir. CRC32 hesaplamalarını hızlandırmak için bu talimatı nasıl kullanabilirim? Tüm Intel'in CRC32
öğretimCRC32, Intel'e özgü talimatlardan nasıl yararlanılır?
8
A
cevap
7
İlk yapabilirsiniz gcc
kullanarak CRC32C için Intel'in donanım hızlandırma kullanmak için
(. bu farklı bir polinomu düzenli CRC32 Wikipedia CRC32 girişi bak kullanır) CRC-32C
hesaplamak için hizmet eder:
- Inline derleme dil
- Kullanım intrinsics
_mm_crc32_u8
,_mm_crc32_u16
,_mm_crc32_u32
veya_mm_crc32_u64
. Intel'inicc
derleyicisinin açıklamaları için Intel Intrinsics Guide'a bakın ancakgcc
da bunları uygular.
asm
özetinden C kodunda
Bu bunu bir seferde 8 bayt sürdüğü ileri performans artışı verecekti __mm_crc32_u64
kullanarak, her seferinde bir bayt alır __mm_crc32_u8
ile bunu yapacağını nasıl.
uint32_t sse42_crc32(const uint8_t *bytes, size_t len)
{
uint32_t hash = 0;
size_t i = 0;
for (i=0;i<len;i++) {
hash = _mm_crc32_u8(hash, bytes[i]);
}
return hash;
}
Eğer
CFLAGS
yılında
-msse4.2
geçmesi gerekiyor bu derlemek için.
gcc -g -msse4.2 test.c
gibi, aksi takdirde
undefined reference to _mm_crc32_u8
hakkında şikayette bulunacaktır.
Düz bir C uygulamasına geri dönmek istiyorsanız, yürütülebilir dosyanın çalıştığı platformda mevcut değilse, GCC'nin ifunc
özniteliğini kullanabilirsiniz.
uint32_t sse42_crc32(const uint8_t *bytes, size_t len)
{
/* use _mm_crc32_u* here */
}
uint32_t default_crc32(const uint8_t *bytes, size_t len)
{
/* pure C implementation */
}
/* this will be called at load time to decide which function really use */
/* sse42_crc32 if SSE 4.2 is supported */
/* default_crc32 if not */
static void * resolve_crc32(void) {
__builtin_cpu_init();
if (__builtin_cpu_supports("sse4.2")) return sse42_crc32;
return default_crc32;
}
/* crc32() implementation will be resolved at load time to either */
/* sse42_crc32() or default_crc32() */
uint32_t crc32(const uint8_t *bytes, size_t len) __attribute__ ((ifunc ("resolve_crc32")));
1
gibi CRC-32C hızlı donanım ve yazılım uygulamaları için this answer bakınız. Donanım uygulaması, hız için paralel olarak üç crc32
yönergesini etkin bir şekilde çalıştırır.
LGPL kodunu okumak sizin için yasal ise, bkz. Http://code.woboq.org/qt5/qtbase/src/corelib/tools/qhash.cpp.html#95 – peppe