首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SSE指令

使用SSE指令
EN

Stack Overflow用户
提问于 2009-02-25 15:55:23
回答 15查看 38.1K关注 0票数 29

我有一个用C++编写的循环,它对一个大整数数组的每个元素执行。在循环中,我屏蔽了整数的一些位,然后找到最小值和最大值。我听说如果我对这些操作使用SSE指令,它将比使用按位AND和if-else条件编写的普通循环运行得快得多。我的问题是,我是否应该使用这些SSE说明?另外,如果我的代码在不同的处理器上运行,会发生什么?它还能工作吗?或者这些指令是特定于处理器的?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2009-02-25 16:09:33

  1. SSE指令是特定于处理器的。你可以在维基百科上查找哪个处理器支持哪个SSE版本。
  2. SSE代码是否会更快取决于许多因素:第一个当然是问题是内存还是CPU。如果内存总线是瓶颈,那么SSE不会有太大帮助。
  3. 注意,编写SIMD代码比编写C++代码要难得多,而且生成的代码也更难更改。始终保持C++代码是最新的,您会希望它作为注释,并检查汇编程序代码的正确性。
  4. 考虑使用一个像IPP这样的库,它实现了为各种处理器优化的常见低级C++操作。
票数 25
EN

Stack Overflow用户

发布于 2009-02-25 16:24:24

SIMD (以SSE为例)允许您对多个数据块执行相同的操作。因此,使用SSE作为整数运算的直接替代不会有任何优势,只有在可以一次对多个数据项进行运算的情况下才能获得优势。这包括在内存中加载一些连续的数据值,执行所需的处理,然后单步执行数组中的下一组值。

问题:

1如果代码路径依赖于正在处理的数据,则SIMD将变得更加难以实现。例如:

代码语言:javascript
复制
a = array [index];
a &= mask;
a >>= shift;
if (a < somevalue)
{
  a += 2;
  array [index] = a;
}
++index;

并不像SIMD那样容易做到:

代码语言:javascript
复制
a1 = array [index] a2 = array [index+1] a3 = array [index+2] a4 = array [index+3]
a1 &= mask         a2 &= mask           a3 &= mask           a4 &= mask
a1 >>= shift       a2 >>= shift         a3 >>= shift         a4 >>= shift
if (a1<somevalue)  if (a2<somevalue)    if (a3<somevalue)    if (a4<somevalue)
  // help! can't conditionally perform this on each column, all columns must do the same thing
index += 4

2如果数据不是连续的,那么将数据加载到SIMD指令中是很麻烦的

3代码是特定于处理器的。SSE仅在IA32 (英特尔/AMD)上,并不是所有的IA32 cpus都支持SSE。

你需要分析算法和数据,看看它是否可以进行SSE,这需要知道SSE是如何工作的。英特尔的网站上有大量的文档。

票数 16
EN

Stack Overflow用户

发布于 2009-02-26 16:19:09

这类问题是一个很好的例子,说明了一个好的低级分析器是必不可少的。(类似于VTune)它可以让你对你的热点位置有更多的了解。

我猜测,根据您的描述,您的热点可能是由于使用if/else进行最小/最大计算而导致的分支预测失败。因此,使用SIMD内部函数应该允许您使用min/max指令,但是,尝试使用无分支min/max计算可能是值得的。这可能会以较少的痛苦获得大部分收益。

如下所示:

代码语言:javascript
复制
inline int 
minimum(int a, int b)
{
  int mask = (a - b) >> 31;
  return ((a & mask) | (b & ~mask));
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/586609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档