在AVX2 Haswell处理器中加载256位向量寄存器

时间:2013-02-01 12:08:10

标签: cpu-architecture avx2

我想加载一个256 bit YMM寄存器,其中包含32个值,每个值长度为1个字节。我查看的所有内在加载double word,即4 byte整数或quad word,即8 byte值。 如何加载大小小于这些数据? 是否有任何助记符可以做到这一点,但没有相应的内在函数?

5 个答案:

答案 0 :(得分:1)

我认为没有办法只收集字节。但听起来我觉得你需要重新思考你的问题。这是像素数据吗?例如RGBA值?如果是这样,也许您可​​以更改您的应用程序,以便读取/写出例如RRRRGGGGBBBB(SSE)。然后你不必收集字节。您可以一次读取128/256位,这将是最有效地使用SIMD。

请注意,您可以通过使用short int操作来提高效率。我的意思是16位,并使用16位整数SSE / AVX指令。

以下是SSE的双线性插值示例,它读取四个字节(RGBA)的整数,并将它们扩展为16位。这比将它们扩展到32位更快。 SSE3示例将RGBARGBARGBARGBA转换为RRRRGGGGBBBB。 http://fastcpp.blogspot.no/2011/06/bilinear-pixel-interpolation-using-sse.html

答案 1 :(得分:1)

这是一个相当古老的问题,但我认为您可能需要的是AVX内在__m256i _mm256_set_epi8,它将32个字符作为输入参数。

答案 2 :(得分:0)

没有广播单字节的指令,但您可以使用_mm256_set1_epi8内在函数来实现此效果。

答案 3 :(得分:0)

你可以简单地使用_mm256_load_si256内在的强制转换。此内在对应于VMOVDQA指令。

这是从内存中读取字节并将其存储在内存中的代码。

char raw[32] __attribute__ ((aligned (32)));
__v32qi foo = _mm256_loadu_si256( (__m256i*) raw ); // read raw bytes from memory into avx register
_mm256_store_si256( (__m256i*) raw, foo ); // store contents of avx register into memory

如果您愿意,也可以使用_mm256_loadu_si256加载未对齐的字节。

答案 4 :(得分:0)

你期望32指针来自哪里?除非您想在256字节的查找表中进行32次并行查找,否则源操作数中没有空间来写入加载所需的地址。

我认为你必须做四个8x32位的聚合操作,然后合并结果;收集操作支持未对齐的访问,因此您可以从调整的地址加载以在YMM寄存器中的正确位置获取目标字节,然后只使用掩码和OR进行合并。