2

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

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

我怎样才能以这种方式将它们写入内存?我可以以某种方式将__m256i8 个打包整数的__m128i值转换为包含 8 个打包短裤的值吗?

我的目标是 AVX2 内在函数,但如果它可以在 AVX 内在函数中完成,那就更好了。

4

1 回答 1

3

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

使用 AVX1,提取一个向量的高半部分并_mm_packus_epi32打包成__m128i. 这仍然需要 2 个 shuffle 指令,但会产生一半的数据输出宽度。(虽然它在 Zen1 上很好,YMM 寄存器无论如何都被视为 2x 128 位的一半,并且vextractf128在 Zen1 上比在 CPU 上更便宜,因为它是一个实际的 shuffle。)

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

于 2021-03-04T04:06:08.763 回答