首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVX2移位(16位)整数

AVX2移位(16位)整数
EN

Stack Overflow用户
提问于 2015-02-23 07:25:08
回答 1查看 1.4K关注 0票数 1

在AVX2中是否有对(16位)整数元素执行右移和左移操作的内置指令?

如下例所示:

代码语言:javascript
复制
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] --> [16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

代码语言:javascript
复制
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] --> [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

其中_mm_srli_si128(H,14)_mm_slli_si128(H,2)在SSE3 16位元素上工作得很好。我之所以这样问,是因为性能(运行时间)对我来说至关重要。

EN

回答 1

Stack Overflow用户

发布于 2017-04-12 17:25:28

不幸的是,AVX2中没有这样的指令。所有AVX2指令都被SSE2扩展到256位,并考虑到在128位SSE2中使用时的兼容性。

如果您知道编译时要移位的16位整数的数量,则可以组合使用permute和shift。例如,您可以在逻辑上将值分解为64位块,对这些块进行置换和移位,然后将其合并。

这就是我在代码中如何做到这一点

代码语言:javascript
复制
static __m256i m256_srl16_1(__m256i i) {
    // suppose i is [16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

    //[4, 3, 2, 1,      16, 15, 14, 13,   12, 11, 10, 9,   8, 7, 6, 5]
    __m256i srl64_q = _mm256_permute4x64_epi64(i, _MM_SHUFFLE(0,3,2,1));

    //[ 1, 0, 0, 0      13, 0, 0, 0       9, 0, 0, 0       5, 0, 0, 0]
    __m256i srl64_m = _mm256_slli_epi64(srl64_q, 3*16);
    //[ 0, 16, 15, 14,  0, 12, 11, 10,    0, 8, 7, 6,      0, 4, 3, 2]
    __m256i srl16_z = _mm256_srli_epi64(i, 1*16);

    __m256i srl64 = _mm256_and_si256(srl64_m, _mm256_set_epi64x(0, ~0, ~0, ~0));
    __m256i r = _mm256_or_si256(srl64, srl16_z);

    return r;
}

如果需要移位超过64位,则需要对原始值进行额外的排列,并屏蔽掉不需要的位

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28664642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档