上交所须知
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。
我有一个关于 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。