【发布时间】:2018-12-06 17:07:58
【问题描述】:
我有一个关于 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
但是由于我们只将两个值相加,这违背了一次执行多条指令的整个目的。
任何帮助都会非常有用。 亲切的问候!
【问题讨论】:
-
那是 SSE 不是 SEE。是的,它确实添加了两个值,但它一次添加了 16 对。您可以使用其中的 3 个来计算 16 个
Number实例。 -
看到了吗?你是说上海证券交易所吗?
-
如果你想除以 256,你需要一个比 char 更大的类型...
-
你不认为编译器会为你做到这一点,现代编译器非常擅长优化。
-
@pm100,你会这么认为,但在处理
chars 时它们并不那么热(除非我忘记了一个选项):gcc.godbolt.org/z/htGiqy