首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将每个AVX 32位元素的低16位存储到存储器中

将每个AVX 32位元素的低16位存储到存储器中
EN

Stack Overflow用户
提问于 2021-03-04 06:48:39
回答 1查看 156关注 0票数 1

我在AVX值__m256i中有8个整数值,它们都以0xffff为上限,所以高16位都是零。

现在我想将这8个值存储为8个连续的uint16_t值。

我怎么能用这种方式把它们写到内存中呢?我能以某种方式将8个压缩整数的__m256i值转换为包含8个压缩短线的__m128i值吗?

我的目标是AVX2内部,但如果它可以在AVX内部,更好。

EN

回答 1

Stack Overflow用户

发布于 2021-03-04 12:06:09

使用AVX2,使用_mm256_packus_epi32 + _mm256_permutex_epi64来修复打包两个__m256i输入的通道内行为,就像@chtz所说的那样。然后,您可以从64字节的输入存储所有32字节的输出。

使用AVX1,将一个向量的高半部分提取出来,并将_mm_packus_epi32包放入__m128i。这仍然会花费2条混洗指令,但产生的数据输出宽度是它们的一半。(尽管它在Zen1上很好,因为YMM寄存器被视为2x128位的二分之一,而且vextractf128在Zen1上比在CPU上更便宜,在CPU上它实际上是一种混洗。)

当然,在只使用AVX1的情况下,__m256i中不太可能有整数数据,除非它是从内存加载的,在这种情况下,您应该首先执行_mm_loadu_si128。但是对于AVX2来说,32字节的加载可能是值得的,即使这意味着你每个存储需要2次打乱而不是1次,特别是如果你的任何输入没有16个字节对齐。

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

https://stackoverflow.com/questions/66466112

复制
相关文章

相似问题

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