上交所须知

SSE Instructions

我有一个关于 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

但是由于我们只将两个值加在一起,这违背了一次执行多条指令的全部目的。

如有任何帮助,我们将不胜感激。 亲切的问候!

如果您可以提供更多有关您实际如何使用它的信息,则可能会更好地优化它,但根据您所写的内容,我猜您会想要 _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 是 1 表示 z,2 表示 y, x 为 1。