Mra*_*anz 3 boost sse visual-c++
我正在尝试优化运行 CRC32 检查的一段代码。
对于测试缓冲区,我执行了以下操作:
char *buff = new char[1024];
for (int i = 0; i < 1024; ++i)
buff[i] = i;
Run Code Online (Sandbox Code Playgroud)
目前,我使用boost的crc实现如下:
boost::crc_optimal<32, 0x1EDC6F41, 0, 0> crc;
crc.process_bytes(buff, 1024);
unsigned int boostCRC = crc();
Run Code Online (Sandbox Code Playgroud)
这意味着多项式“0x1EDC6F41”的初始值为 0,最终异或为 0。
然后,我编写了最简单的 sse4.2 版本的 crc32c 算法:
unsigned int sseCRC = 0;
for (char *iter = buff, *end = buff + 1024; iter != end; ++iter)
sseCRC = _mm_crc32_u8(sseCRC, *iter);
Run Code Online (Sandbox Code Playgroud)
问题是,最终值不匹配,即使多项式应该是相同的。有人有这方面的经验吗?我的 sse 版本有问题吗?
小智 5
根据Intel\xc2\xae SSE4 编程参考,CRC 指令执行位反射,在 boost CRC 模板中默认关闭。使用
\n\nboost::crc_optimal<32, 0x1EDC6F41, 0, 0, true, true> crc;\nRun Code Online (Sandbox Code Playgroud)\n\n代替
\n\nboost::crc_optimal<32, 0x1EDC6F41, 0, 0> crc;\nRun Code Online (Sandbox Code Playgroud)\n\n将产生与 SSE 版本相同的校验和。
\n| 归档时间: |
|
| 查看次数: |
1704 次 |
| 最近记录: |