您需要付出多少努力来获得使用SSE的收益?

时间:2010-04-12 16:18:39

标签: c++ sse

<案例一

说你有一个小班:

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优化单向量操作实际上是否值得,或者它在进行批量操作时是否真的有价值?

4 个答案:

答案 0 :(得分:6)

一般情况下,您需要采取其他措施来充分利用SSE(或任何其他SIMD架构):

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

  • 数据需要连续

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

Gamasutra article显示了制作基于SSE的快速代码所需的内容。它详细介绍了您的“案例1”。

源代码可从作者的homepage获得。

答案 3 :(得分:0)

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

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