我在AVX值__m256i中有8个整数值,它们都以0xffff为上限,所以高16位都是零。
现在我想将这8个值存储为8个连续的uint16_t值。
我怎么能用这种方式把它们写到内存中呢?我能以某种方式将8个压缩整数的__m256i值转换为包含8个压缩短线的__m128i值吗?
我的目标是AVX2内部,但如果它可以在AVX内部,更好。
发布于 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个字节对齐。
https://stackoverflow.com/questions/66466112
复制相似问题