使用AVX仿真32个字节的移位 [英] Emulating shifts on 32 bytes with AVX
问题描述
我正在使用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) code>
或
_mm256_slli_si256(_mm256_permute2x128_si256(A, _MM_SHUFFLE(0,0,3,0)),N)
但问题仍然在于 _mm256_srli_si256
。
从不同的输入,我收集了这些解决方案。跨过路径间障碍的关键是align指令, _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> N < 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
code> _mm256_permute2x128_si256(A,A,_MM_SHUFFLE(2,0,0,1))
16 < N < 32
_mm256_srli_si256(_mm256_permute2x128_si256(A,A,_MM_SHUFFLE(2,0,0,1)),N - 16)
I am migrating vectorized code written using SSE2 intrinsics to AVX2 intrinsics.
Much to my disappointment, I discover that the shift instructions _mm256_slli_si256 and _mm256_srli_si256 operate only on the two halves of the AVX registers separately and zeroes are introduced in between. (This is by contrast with _mm_slli_si128 and _mm_srli_si128 that handle whole SSE registers.)
Can you recommend me a short substitute ?
UPDATE:
_mm256_slli_si256
is efficiently achieved with
_mm256_alignr_epi8(A, _mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)
or
_mm256_slli_si256(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)
for shifts larger than 16 bytes.
But the question remains for _mm256_srli_si256
.
From different inputs, I gathered these solutions. The key to crossing the inter-lane barrier is the align instruction, _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 < N < 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 < N < 32
_mm256_srli_si256(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(2, 0, 0, 1)), N - 16)
这篇关于使用AVX仿真32个字节的移位的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!