CRC32C SSE vs BOOST

时间:2013-03-02 13:59:59

标签: visual-c++ boost sse

我正在尝试优化运行CRC32检查的代码。

对于测试缓冲区,我执行了以下操作:

char *buff = new char[1024];
for (int i = 0; i < 1024; ++i)
    buff[i] = i;

目前,我正在使用boost的crc实现如下:

boost::crc_optimal<32, 0x1EDC6F41, 0, 0> crc;
crc.process_bytes(buff, 1024);
unsigned int boostCRC = crc();

这意味着多项式“0x1EDC6F41”的初始值为0,最终的xor为0。

然后,我写了最简单的crc32c算法的sse4.2版本:

unsigned int sseCRC = 0;
for (char *iter = buff, *end = buff + 1024; iter != end; ++iter)
    sseCRC = _mm_crc32_u8(sseCRC, *iter);

问题是,即使多项式应该是相同的,最终值也不匹配。有没有人有这方面的经验?我对sse版本做错了吗?

1 个答案:

答案 0 :(得分:4)

根据Intel® SSE4 Programming Reference,CRC指令执行位反射,默认情况下在boost CRC模板中关闭。使用

boost::crc_optimal<32, 0x1EDC6F41, 0, 0, true, true> crc;

而不是

boost::crc_optimal<32, 0x1EDC6F41, 0, 0> crc;

将产生与SSE版本相同的校验和。