相关疑难解决方法(0)

使用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)

要么

_mm256_slli_si256(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)

对于大于16字节的移位.

但问题仍然存在_mm256_srli_si256.

c++ simd intrinsics sse2 avx2

11
推荐指数
2
解决办法
2881
查看次数

向左和向右移位SSE/AVX寄存器,同时以零移位

我希望左移或右移32位的SSE/AVX寄存器,同时移位为零.

让我对我感兴趣的转变更加准确.对于SSE,我想做四个32位浮点数的以下转换:

shift1_SSE: [1, 2, 3, 4] -> [0, 1, 2, 3]
shift2_SSE: [1, 2, 3, 4] -> [0, 0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

对于AVX,我想转移做以下转变:

shift1_AVX: [1, 2, 3, 4, 5, 6, 7, 8] -> [0, 1, 2, 3, 4, 5, 6, 7]
shift2_AVX: [1, 2, 3, 4, 5, 6, 7, 8] -> [0, 0, 1, 2, 3, 4, 5, 6]
shift3_AVX: [1, 2, 3, 4 ,5 ,6, 7, 8] -> [0, 0, 0, 0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

对于SSE,我提出了以下代码

shift1_SSE = …
Run Code Online (Sandbox Code Playgroud)

x86 sse simd avx avx2

8
推荐指数
2
解决办法
5224
查看次数

标签 统计

avx2 ×2

simd ×2

avx ×1

c++ ×1

intrinsics ×1

sse ×1

sse2 ×1

x86 ×1