使用AVX仿真32个字节的移位 [英] Emulating shifts on 32 bytes with AVX

查看:963
本文介绍了使用AVX仿真32个字节的移位的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆