我正在将使用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.
我希望左移或右移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)