我有个关于SSE教学的问题。
我希望这是提出这样一个问题的正确地方,如果没有,请告诉我,我将删除这个问题。
我的目标是使用SSE指令并行执行3个字符的计算。
我有一个typedef结构,它具有它被打包的属性。
typedef struct
{
unsigned char x;
unsigned char y;
unsigned char z;
} __attribute__((packed)) Number;对于每一个字符,我必须经过一定的计算。
例如:
((Number[0].x * 20) / 256);我必须对每一个字符做一个小的计算,然后把它们加在一起。
由于我必须在汇编中编写代码,我已经做了一些研究,并无意中发现了这个指令:
__m128i _mm_add_epi8 (__m128i a, __m128i b)就我而言,这应该将两个值(每个值的大小为8个字节)加在一起,并保存结果。
至少我是这么理解的:从这个链接
但是,由于我们只将两个值相加在一起,这就违背了同时执行多个指令的整个目的。
任何帮助都是非常有意义的。亲切的问候!
发布于 2018-12-06 18:09:10
如果您能够提供更多关于实际如何使用它的信息,也许可以更好地优化它,但基于您所写的内容,我想您可能需要类似于_mm_srli_epi32(_mm_mullo_epi32(_mm_set_epi32(n.x, n.y, n.z, 0), _mm_set1_epi32(20)), 8)的东西。它需要SSE4.1,但是如果您想要对SSE 2有效的东西,请参阅4个32位整数的SSE乘法来替换_mm_mullo_epi32。
您没有指定要对结果做什么,但是可以使用类似于((int*) &r_sse)[i]的方法来访问结果,其中i为z为1,y为2,x为1。
https://stackoverflow.com/questions/53656447
复制相似问题