情况之一

说你有一个小类:

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;
}

一个天真的用途上证会简单地取代这些功能机构有使用几内部函数。但我们会期待这个有多大差别?试试吧用于涉及成本高昂的国家cahnges请参考,并证或者是他们就像其他的指令?而且,即使没有直接的"使用证"的开销,会运动的价值为证登记和背出来了真正做快点吗?

情况中的两个

相反,你的工作一小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];
  }
}

什么有关使用证在这里?任何更好吗?

在结论

是想要优化单一矢量的操作使用上证实际上是值得的,或者是它真的仅是宝贵的时散行动?

有帮助吗?

解决方案

一般的你会需要采取额外的步骤,以获得最好的证(或任何其他单指令构):

  • 数据需要16字节对准(地区)

  • 数据的需要是连续的

  • 你需要足够的数据单指令运作是值得的

  • 你需要凝聚作为许多操作,可以减轻成本负荷/店

  • 你需要知道的高速缓存/存储层次结构及其业绩的影响(例如使用条采矿/贴砖)

其他提示

这是有价值的,如果你是区分的是,你的数据的范围内做了很多相同的计算。比如你计算多对多方程的平方根。您可以在SSE寄存器和调用操作加载4个值一次。这将由4提高性能。

和有有在他们里面所有的SSE优化库。不要重新自行车。

Gamasutra的文章节目如何才能做出快速SSE基于代码。它涵盖了你的“案例1”的细节。

的源代码可从作者的主页

我在几年前试图案例一在工作和性能增益是几乎无法测量。在最后,我决定与16个字节边界对齐所有Point3D跳过它,因为所有的麻烦使它不值得的。

正如你猜中SSE最适合于批量操作,他们可以提供一个相当不错的速度了。在你继续使用上证所内部函数检查哪些代码编译器已经产生。我从经验中知道,比如Visual Studio是在使用SSE的优化还不错。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top