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