题
情况之一
说你有一个小类:
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的优化还不错。
不隶属于 StackOverflow