我正在将使用 SSE2 内在函数编写的矢量化代码迁移到 AVX2 内在函数。
令我非常失望的是,我发现移位指令 _mm256_slli_si256 和 _mm256_srli_si256 仅分别对 AVX 寄存器的两半进行操作,并且在其间引入了零。 (这与处理整个 SSE 寄存器的 _mm_slli_si128 和 _mm_srli_si128 形成对比。)
你能给我推荐一个简短的替代品吗?
更新:
_mm256_slli_si256
可以通过
_mm256_alignr_epi8(A, _mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)
或
_mm256_slli_si256(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)
对于大于 16 字节的移位。
但问题仍然存在于 _mm256_srli_si256
。
最佳答案
我从不同的输入中收集了这些解决方案。跨越车道间障碍的关键是对齐指令,_mm256_alignr_epi8
。
_mm256_slli_si256(A, N)
0 < N < 16
_mm256_alignr_epi8(A, _mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 2, 0)), 16 - N)
N = 16
_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 2, 0))
16 < 数 < 32
_mm256_slli_si256(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 2, 0)), N - 16)
_mm256_srli_si256(A, N)
0 < N < 16
_mm256_alignr_epi8(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(2, 0, 0, 1)), A, N)
N = 16
_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(2, 0, 0, 1))
16 < 数 < 32
_mm256_srli_si256(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(2, 0, 0, 1)), N - 16)
关于c++ - 使用 AVX 模拟 32 字节的移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25248766/