_mm_crc32给出与手动版本不同的结果
_mm_crc32 giving different results that manual version
我有以下代码(手动版本来自阿德勒的答案(
#include <iostream>
#include <nmmintrin.h>
#define POLY2 0x82f63b78
uint32_t crc32c2(uint32_t crc, const unsigned char *buf, size_t len)
{
int k;
crc = ~crc;
while (len--) {
crc ^= *buf++;
for (k = 0; k < 8; k++)
crc = crc & 1 ? (crc >> 1) ^ POLY2 : crc >> 1;
}
return ~crc;
}
int main(int argc, char **argv)
{
const unsigned int val = 5;
std::cout << std::hex << crc32c2(0,(const unsigned char*)&val,4) << std::endl;
std::cout << _mm_crc32_u32(0, 5) << std::endl;
}
输出为:
EE00D08C
A6679B4B
我的问题是为什么手动版本没有给出与内部版本相同的答案。
Mark Adler关于在软件中实现SSE 4.2的CRC32C的回答表明,您需要从0 ^ 0xffffffff
开始,并以crc0 ^ 0xffffffff;
结束,以预处理和后处理结束。 (或者像在 SW 版本中那样使用~
运算符(。
Mark 的回答使用 GNU C 内联 asm,但内在移植会很简单。 (它与多个累加器一起展开,以隐藏crc32_u64
在大缓冲区上的延迟。
此版本适用于我的系统。
int main(int argc, char **argv)
{
const unsigned int val = 5;
std::cout << std::hex << crc32c2(0,(const unsigned char*)&val,4) << 'n';
std::cout << (_mm_crc32_u32(0^0xffffffff, 5) ^ 0xffffffffU) << 'n';
}
(请注意,std::endl
比换行符慢毫无意义,除非您确实需要强制刷新,以防流是完全缓冲而不是行缓冲。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 导入库可以跨dll版本工作吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- _mm_crc32给出与手动版本不同的结果
- 功能模板与Variadic模板过载:Intel C 编译器版本18产生的结果不同于其他编译器.英特尔是错误的
- 在发布版本中划分两个双精度的结果错误
- 用不同版本的Ubuntu上的GCC编译会产生不同的结果
- 使用不同版本编译的相同代码提供不同的结果
- OpenCL - 结果与 CPU 版本不同
- 顺序和并行版本给出不同的结果 - 为什么
- SSE版本的结果不同
- 为什么sprintf_s在不同版本的Visual Studio中给出不同的结果?