Intel在SSE4.2指令集中有一個特定的CRC32
instruction。我怎樣才能利用這個指令來加速CRC32的計算?如何利用Intel特定的指令來實現CRC32?
8
A
回答
7
所有英特爾CRC32
指令首先用於計算CRC-32C
(即使用不同的多項式,定期CRC32看Wikipedia CRC32條目)。
要使用gcc
,您可以使用英特爾的硬件加速CRC32C:
-
通過
- 聯彙編語言
- 使用內在
_mm_crc32_u8
,_mm_crc32_u16
,_mm_crc32_u32
或_mm_crc32_u64
。有關英特爾編譯器icc
的描述,請參見Intel Intrinsics Guide,但gcc
也可實現它們。
asm
聲明C代碼
這是你將如何與__mm_crc32_u8
,在一次接受一個字節,使用__mm_crc32_u64
因爲它需要8個字節在同一時間將給出進一步的性能提升做。
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;
}
要編譯這一點,你需要通過-msse4.2
在CFLAGS
。像gcc -g -msse4.2 test.c
,否則它會抱怨undefined reference to _mm_crc32_u8
。
如果您希望恢復爲普通的C實現,如果該指令在可執行文件運行的平臺中不可用,則可以使用GCC的ifunc
屬性。像
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
請參閱this answer快速硬件和軟件實現CRC-32C。爲了提高速度,硬件實現有效地並行運行三條指令。
相關問題
- 1. 如何指定特定的JAXB實現?
- 2. 如何使用C64x + GMPY指令來計算CRC32?
- 3. .NET Micro上的CRC32實現
- 4. CRC32英特爾實施
- 5. 如何實現Ionic的拖放指令?
- 6. 如何實現加載指令AngularJS
- 7. 如何使用我的APK計算特定文件的CRC32/MD5
- 8. AngularJS:如何針對多個實例的特定指令
- 9. MOD_Rewrite指令實現一個重定向
- 10. 角指令 - 利用NG-transclude
- 11. 如何使用匯編中的所有其他指令來實現MUL?
- 12. 如何強制靜態類來實現特定的方法?
- 13. 如何提供特定的GWT實現
- 14. 如何實現特定任務的Listner?
- 15. 如何實現特定的排序?
- 16. 如何在我的自定義指令中使用現有的ng-repeat指令?
- 17. 如何定義Angular指令必須是Angular中特定指令的子代?
- 18. 如何執行子類來實現包含特定值
- 19. 在Spring中,如何指定BindingResult實現
- 20. 如何操縱DOM來利用MVVM模式,我想使用Knockout的點擊綁定來實現這個片段
- 21. 實現指定MATLAB
- 22. Java,利用特定的JPanel
- 23. 最好的方式來實現的指針在斯威夫特
- 24. angularjs:如何禁用特定元素的指令
- 25. 如何在使用LLVM的特定指令後插入呼叫?
- 26. 如何在特定目標的makefile中使用include指令
- 27. 如何使指令引用數組中的特定行 - 角度
- 28. 我在哪裏可以獲得特定IL指令的本機實現?
- 29. 發現特權和敏感的指令
- 30. 如何使用boost :: spirit :: lex實現include指令?
如果您閱讀LGPL代碼是合法的,請參閱http://code.woboq.org/qt5/qtbase/src/corelib/tools/qhash.cpp.html#95 – peppe