我对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个字节)相加并保存结果。
至少我是这样理解的: From this link
但是,由于我们仅将两个值加在一起,因此无法同时执行多个指令。
任何帮助都会非常有用。 亲切的问候!
答案 0 :(得分:1)
如果您可以提供有关如何实际使用它的更多信息,则可能可以更好地对其进行优化,但是基于您所写的内容,我猜您希望使用类似_mm_srli_epi32(_mm_mullo_epi32(_mm_set_epi32(n.x, n.y, n.z, 0), _mm_set1_epi32(20)), 8)
的东西。它需要SSE 4.1,但是如果您想要适用于SSE 2的产品,请参见SSE multiplication of 4 32-bit integers来进行_mm_mullo_epi32
的替换。
您没有指定要对结果执行的操作,但是可以使用类似((int*) &r_sse)[i]
的方法来访问结果,其中i
对于z是1,对于y是2,对于1用于x。