上证所指示

时间:2018-12-06 17:07:59

标签: c intel sse

我对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

但是,由于我们仅将两个值加在一起,因此无法同时执行多个指令。

任何帮助都会非常有用。 亲切的问候!

1 个答案:

答案 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。