X86 AVX2上的256位CRC计算

X86 AVX2上的256位CRC计算,x86,intel,simd,crc,avx2,X86,Intel,Simd,Crc,Avx2,“英特尔SSE4.2内部集成电路”上存在64位CRC函数 unsigned __int64 _mm_crc32_u64 (unsigned __int64 crc, unsigned __int64 v) 但是,我在AVX2内部函数上找不到256位版本的CRC计算。 我在程序中使用了256位变量_m256i,所以我想计算256位上的crc或散列。如何使用Intel AVX2执行此操作?不是SIMD内部指令,即使它在概念上是SSE4.2的一部分-它只是一条在64位值上运行的普通标量指令。因此,谈

“英特尔SSE4.2内部集成电路”上存在64位CRC函数

unsigned __int64 _mm_crc32_u64 (unsigned __int64 crc, unsigned __int64 v)
但是,我在AVX2内部函数上找不到256位版本的CRC计算。 我在程序中使用了256位变量_m256i,所以我想计算256位上的crc或散列。如何使用Intel AVX2执行此操作?

不是SIMD内部指令,即使它在概念上是SSE4.2的一部分-它只是一条在64位值上运行的普通标量指令。因此,谈论128位或256位SIMD版本是没有意义的——您只需要在循环中将其应用于无符号64位值数组


有关各种x86 CRC32指令和内部函数的更详细说明,请参阅。

在这种情况下,我是否应该对来自每4个循环的crc值求和?因为我想将256位表示为一个crc值。您不应该添加crc-您应该以正确的顺序累积crc您正在生成的所有数据。如果这仍然不清楚,那么您可能需要开始一个新的问题,解释您试图做什么,并包括现有代码的相关部分。另一方面,对256位向量(如_mm_crc32_u64函数)应用子操作移位、XOR、MOD2等是否合乎逻辑?不,CRC是一种顺序操作,因此,除非您想为单独的数据流并行生成单独的CRC,否则您只需生成一个带有标量循环的CRC,正如上面的回答中所述。我现在了解crc32和u64操作,但我想在一个序列中使用256位(至少128位)来计算CRC,以提高性能。我会问一个新问题。