从AVX寄存器中提取并存储交替的低32位 [英] Extract and store alternate lower 32 bits from AVX register
本文介绍了从AVX寄存器中提取并存储交替的低32位的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我编写了以下代码:
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屋!
查看全文