【问题标题】:SSE Instructions上交所说明
【发布时间】: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

标签: c intel sse


【解决方案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 是 1 代表 z,2 代表 y,1 代表 x。

【讨论】:

  • 我正在使用它将图像转换为灰色。我有 3 个红色、蓝色和绿色的字符,每个字符都必须经过一定的计算,然后需要加在一起。然后将计算结果传递给每个 char(因此每个 char 获得相同的值),结果应该是一个灰色像素。
  • _mm_mullo_epi32 有点慢,我们不能在这里使用 16 位算法吗?
猜你喜欢
  • 2020-09-03
  • 2016-04-04
  • 2016-11-25
  • 2021-07-09
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
相关资源
最近更新 更多