【问题标题】:How much effort do you have to put in to get gains from using SSE?您需要付出多少努力才能从使用 SSE 中获得收益?
【发布时间】:2010-04-12 16:18:38
【问题描述】:

案例一

假设你有一个小班:

class Point3D
{
private:
  float x,y,z;
public:
  operator+=()
  
  ...etc
};

Point3D &Point3D::operator+=(Point3D &other)
{
  this->x += other.x;
  this->y += other.y;
  this->z += other.z;
}

简单地使用 SSE 会简单地用一些内在函数替换这些函数体。但是我们会期望这会产生很大的不同吗? MMX 曾经涉及昂贵的状态变化 IIRC,SSE 还是它们就像其他指令一样?即使没有直接的“使用 SSE”开销,将值移入 SSE 寄存器并再次移出真的会更快吗?

案例二

相反,您使用的是较少基于 OO 的代码库。而不是 Point3D 对象的数组/向量,您只需拥有一个大的浮点数组:

float coordinateData[NUM_POINTS*3];

void add(int i,int j) //yes it's unsafe, no overlap check... example only
{
  for (int x=0;x<3;++x)
  {
    coordinateData[i*3+x] += coordinateData[j*3+x];
  }
}

这里使用 SSE 怎么样?有更好的吗?

总结

尝试使用 SSE 优化单向量操作真的值得吗,还是真的只有在进行批量操作时才有价值?

【问题讨论】:

  • 英特尔已经为您完成了所有艰苦的工作,为什么还要打扰 - 您是否考虑过使用 IPP 和 MKL?两个套餐的平均工资都不超过 6-7 小时,非常值得投资。
  • 嗯,但对于最基本的软件包,每位开发人员至少需要 200 美元。如果你有 10 个人,但只有一个人在使用这些工具,他们都需要许可证吗?处理一点代码似乎相当昂贵。
  • 也许可以查看 Directx sdk 附带的 xnamath.h 库。如果您不想使用它,它对 directx 没有任何依赖关系,而是使用 SSE,最重要的是它都在 .h 文件中,因此您可以看到它是如何工作的。至少它可能会给你一些想法和一个简单的方法来尝试使用 SSE

标签: c++ sse


【解决方案1】:

一般而言,您需要采取额外的步骤来充分利用 SSE(或任何其他 SIMD 架构):

  • 数据需要 16 字节对齐(理想情况下)

  • 数据需要连续

  • 您需要足够的数据才能使 SIMD 操作有价值

  • 您需要合并尽可能多的操作以降低加载/存储的成本

  • 您需要了解缓存/内存层次结构及其对性能的影响(例如,使用条带挖掘/平铺)

【讨论】:

  • 如果我们对齐数据结构,那么我们不需要将值加载到寄存器中吗?或者我们仍然这样做,这只是加快了这部分的速度?
  • 您的数据需要 16 字节对齐,以便在内存和 SSE 寄存器之间获得最有效的加载/存储 - SSE 确实支持未对齐的加载/存储,但使用这些会显着降低性能在 Core i7 以外的任何设备上。
【解决方案2】:

如果您的情况是您对数据范围进行大量相同的计算,那么这很有价值。例如,您计算多对多方程的平方根。您可以在 sse 寄存器中加载 4 个值并调用一次操作。这将使性能提高 4。

并且有些库内部包含所有 sse 优化。不要重新发明自行车。

【讨论】:

    【解决方案3】:

    这个Gamasutra article 展示了如何制作基于 SSE 的快速代码。它详细介绍了您的“案例 1”。

    源代码可从作者homepage获取。

    【讨论】:

      【解决方案4】:

      几年前我在工作中尝试了案例一,但性能提升几乎无法衡量。最后我决定跳过它,因为在 16 字节边界上对齐所有 Point3D 的所有麻烦使得它不值得。

      正如您正确猜测的那样,SSE 最适合批量操作,它们可以提供相当不错的加速。在继续使用 SSE 内在函数之前,请检查编译器已经生成了哪些代码。我从经验中知道,例如 Visual Studio 非常擅长使用 SSE 优化。

      【讨论】:

      • 如果您需要编译器的帮助,那么英特尔的 ICC 将比 Visual Studio 做更多的自动矢量化。
      猜你喜欢
      • 1970-01-01
      • 2011-08-17
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 2010-11-07
      • 2021-12-26
      相关资源
      最近更新 更多