gpt4 book ai didi

c++ - _mm_crc32 给出与手动版本不同的结果

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:44 25 4
gpt4 key购买 nike

我有以下代码(手册版本来自 Adler 的 answer )

 #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

我的问题是为什么手动版本没有给出与 intrisic 相同的答案。

最佳答案

Mark Adler 在 Implementing SSE 4.2's CRC32C in software 上的回答表明需要以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 毫无意义地比换行慢,除非您实际上需要强制刷新以防流是全缓冲而不是行缓冲。)

关于c++ - _mm_crc32 给出与手动版本不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50901146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com