说你有一个小班:
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;
}
Run Code Online (Sandbox Code Playgroud)
使用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];
}
}
Run Code Online (Sandbox Code Playgroud)
在这里使用SSE怎么样?好点?
尝试使用SSE优化单向量操作实际上是值得的,还是仅在进行批量操作时才有价值?
通常,您需要采取其他步骤以充分利用SSE(或任何其他SIMD架构):
数据需要16字节对齐(理想情况下)
数据需要连续
您需要足够的数据才能使SIMD操作变得有价值
您需要合并尽可能多的操作以降低装载/存储的成本
您需要了解缓存/内存层次结构及其性能影响(例如,使用条带挖掘/平铺)