Visual c++ CRC32C SSE vs BOOST

Visual c++ CRC32C SSE vs BOOST,visual-c++,boost,sse,Visual C++,Boost,Sse,我正在尝试优化一段运行CRC32检查的代码 对于测试缓冲区,我执行了以下操作: char *buff = new char[1024]; for (int i = 0; i < 1024; ++i) buff[i] = i; 问题是,最终值不匹配,即使多项式应该是相同的。有人有过这方面的经验吗?sse版本有问题吗?根据,CRC指令执行位反射,这在boost CRC模板中默认为关闭。使用 boost::crc_optimal<32, 0x1EDC6F41, 0, 0, tru

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

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

char *buff = new char[1024];
for (int i = 0; i < 1024; ++i)
    buff[i] = i;
问题是,最终值不匹配,即使多项式应该是相同的。有人有过这方面的经验吗?sse版本有问题吗?

根据,CRC指令执行位反射,这在boost CRC模板中默认为关闭。使用

boost::crc_optimal<32, 0x1EDC6F41, 0, 0, true, true> crc;
boost::crc\u最优crc;
而不是

boost::crc_optimal<32, 0x1EDC6F41, 0, 0> crc;
boost::crc\u最优crc;
将产生与SSE版本相同的校验和。

根据,CRC指令执行位反射,这在boost CRC模板中默认为关闭。使用

boost::crc_optimal<32, 0x1EDC6F41, 0, 0, true, true> crc;
boost::crc\u最优crc;
而不是

boost::crc_optimal<32, 0x1EDC6F41, 0, 0> crc;
boost::crc\u最优crc;

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

这几乎肯定是一个endianness问题。我不想费心阅读这两个函数的文档,但我建议您(非常小心!),并检查它们是如何确定端度的。因为SSE版本是固定多项式,所以我能想到的最好方法是将boost多项式翻转到0x416FDC1E,以及在处理第一个字符后检查结果等操作,这些字符会立即发散。我最大的问题是关于sse版本的信息非常稀少,所以我希望有人能在我开始挖掘档案之前,从我的个人经验中找到一个答案,试图使用sse版本来启发我。哦,还有,颠倒sse版本答案的字节顺序,与使用0xFFFFFFFFFFFFFFFFFFR测试xor一起,这几乎肯定是一个端性问题。我不想费心阅读这两个函数的文档,但我建议您(非常小心!),并检查它们是如何确定端度的。因为SSE版本是固定多项式,所以我能想到的最好方法是将boost多项式翻转到0x416FDC1E,以及在处理第一个字符后检查结果等操作,这些字符会立即发散。我最大的问题是关于sse版本的信息非常稀少,所以我希望有人能在我开始挖掘档案之前,从我的个人经验中找到一个答案,试图使用sse版本来启发我。哦,还有,颠倒sse版本答案的字节顺序,以及使用0xFFFFFF测试xor