从AVX寄存器中提取并存储交替的低32位 [英] Extract and store alternate lower 32 bits from AVX register

查看:32
本文介绍了从AVX寄存器中提取并存储交替的低32位的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个__m256i寄存器,我想从每个64位组中提取4个低32位,将它们打包并连续存储到内存中。即,如果__m256i寄存器包含8个32位字:{a0,a1,a2,a3,a4,a5,a6,a7},我希望将四个字{a0,a2,a4,a6}连续存储到存储器

我编写了以下代码:

void mystore(uint32 *dst, const __m256i& src)
{
      __m256 ps256    = _mm256_castsi256_ps(src);
      __m128 lo128    = _mm256_extractf128_ps(ps256, 0);
      __m128 hi128    = _mm256_extractf128_ps(ps256, 1);
      __m128 pack128  = _mm_shuffle_ps(lo128, hi128, 0 + (2<<2) + (0<<4) + (2<<6));
      __m128i r    = _mm_castps_si128(pack);
     _mm256_storeu_si256( reinterpret_cast<__m128i*>(dst), r )
}

如果我是正确的,强制转换操作只是为了满足编译器类型检查,但它们实际上等同于无操作,因此随机指令和2个提取指令的总延迟成本是3,外加未对齐存储的成本。

是否有更快的方法来完成此操作?

谢谢

推荐答案

您可以尝试使用如下内容:

const __m256i K_PERM = _mm256_setr_epi32(0, 2, 4, 6, 1, 3, 5, 7);

inline void mystore(uint32_t * dst, const __m256i & src)
{
    __m256i permuted = _mm256_permutevar8x32_epi32(src, K_PERM);
    __m128i lo128 = _mm256_extractf128_si256(permuted, 0);
    _mm_storeu_si128((__m128i*)dst, lo128);
}

这篇关于从AVX寄存器中提取并存储交替的低32位的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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