原始标量函数
static inline uint32 abc(uint32 bytes, int shift)
{
uint32 kMul= 0x1e35a7bd;
return (bytes * kMul) >> shift;
}
等效AVX功能
static inline uint32 abc(uint32 bytes, int shift)
{
uint32 kMul= 0x1e35a7bd;
__m256i a,b,c,resShift,shift_256i;
a=_mm256_set1_epi32(bytes);
b=_mm256_set1_epi32(kMul);
shift_256i=_mm256_set1_epi32(shift);
c=_mm256_mul_epi32(a,b);
resShift=_mm256_srlv_epi64(c,shift_256i);
// I am not sure what function to use to convert m256i variable into integer
}
我不知道如何在最后一步将m256i变量转换为整数。 resShift具有右移的m256i值,但我必须将其转换为整数形式并从该函数返回。有什么帮助吗?
答案 0 :(得分:2)
您可以咨询Intel Intrinsics Guide。你显然需要一些提取内在的,但我无法一步到位地找到它。以下是两条说明中的操作方法:
__m128i lower = _mm256_extracti128_si256(resShift, 0);
return _mm_extract_epi32(lower, 0);
但是请注意,你在做什么完全没有意义。您不是为单个输入计算单个结果,而是将此输入复制八次并解决八个相同的问题以获得八个相等的答案。所以你可以毫无需要地做八倍的工作。此外,复制本身( set1 _ 内在函数)将需要额外的时间。你的AVX例程不会比标量例程更快。
P.S。顺便说一句,您应该使用 _mm256_srlv_epi32 而不是 _mm256_srlv_epi64 进行移位,因为您已在寄存器中打包了32位数据。