AVX2 上的 256 位 CRC 计算
Posted
技术标签:
【中文标题】AVX2 上的 256 位 CRC 计算【英文标题】:256 bit CRC calculation on AVX2 【发布时间】:2017-04-11 08:50:42 【问题描述】:英特尔 SSE4.2 内部函数中存在 64 位 CRC 函数。
unsigned __int64 _mm_crc32_u64 (unsigned __int64 crc, unsigned __int64 v)
但是,我在 AVX2 内在函数上找不到 256 位版本的 CRC 计算。 我在我的程序中使用 256 位变量 (__m256i),所以我想计算 256 位的 crc(或哈希)。如何使用 Intel AVX2 执行此操作?
【问题讨论】:
【参考方案1】:_mm_crc32_u64
不是 SIMD 内在函数,尽管它在概念上是 SSE4.2 的一部分 - 它只是对 64 位值进行操作的普通标量指令。因此,谈论 128 位或 256 位 SIMD 版本是没有意义的 - 您只需将其循环应用到无符号 64 位值数组即可。
有关各种 x86 CRC32 指令和内在函数的更完整说明,请参阅 this answer。
【讨论】:
在这种情况下,我应该将来自每 4 个循环的 crc 值相加吗?因为我想将 256 位表示为一个 crc 值。 您不应该添加 CRC - 您应该以正确的顺序累积 CRC 您正在生成的所有数据。如果这仍然不清楚,那么您可能需要提出一个新问题,解释您正在尝试做什么,并包含现有代码的相关部分。 另一方面,像 _mm_crc32_u64 函数那样对 256 位向量应用子操作(移位、异或、MOD2 等)是否合乎逻辑? 不,CRC 是一种顺序操作,因此除非您想为单独的数据流并行生成单独的 CRC,否则您只需生成一个带有标量循环的 CRC,如上面的答案中所述. 我现在了解 _mm_crc32_u64 操作,但我想在一个序列中使用 256 位(至少 128 位)计算 CRC 以提高性能。我会问一个新问题。以上是关于AVX2 上的 256 位 CRC 计算的主要内容,如果未能解决你的问题,请参考以下文章
使用 AVX512 或 AVX2 计算所有压缩 32 位整数之和的最快方法