2015-07-02 16 views

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:

    asm özetinden C kodunda
  1. Inline derleme dil
  2. Kullanım intrinsics _mm_crc32_u8, _mm_crc32_u16, _mm_crc32_u32 veya _mm_crc32_u64. Intel'in icc derleyicisinin açıklamaları için Intel Intrinsics Guide'a bakın ancak gcc da bunları uygular.

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.