【发布时间】: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