我有一个表示向量的结构。该向量由两个单字节整数组成。我使用它们来保持0到255之间的值。
typedef uint8_T unsigned char;
struct Vector
{
uint8_T x;
uint8_T y;
};
现在,我程序中的主要用例是将向量的两个元素乘以32位浮点值:
typedef real32_T float;
Vector Vector::operator * ( const real32_T f ) const {
return Vector( (uint8_T)(x * f), (uint8_T)(y * f) );
};
这需要经常进行。有没有办法可以同时执行这两个乘法?也许通过矢量化,SSE或类似?或者Visual Studio编译器是否已经同时执行此操作?
另一个用例是在两个向量之间进行插值。
Vector Vector::interpolate(const Vector& rhs, real32_T z) const
{
return Vector(
(uint8_T)(x + z * (rhs.x - x)),
(uint8_T)(y + z * (rhs.y - y))
);
}
这已经使用了优化的插值方法(https://stackoverflow.com/a/4353537/871495)。
但是,矢量的值再次乘以相同的标量值。 是否有可能改善这些操作的性能?
由于
(我使用带有64位编译器的Visual Studio 2010)
答案 0 :(得分:1)
根据我的经验,Visual Studio(特别是像VS2010这样的旧版本)本身并没有进行大量的矢量化。他们在较新的版本中对它进行了改进,所以如果可以的话,你可能会看到编译器的更改是否会加速你的代码。
根据使用这些函数的代码和编译器的优化,它甚至可能不会使计算速度变慢。函数调用和缓存未命中可能会造成更多伤害。
您可以尝试以下方法:
float
到uint8_t
的演员表所造成的限制(例如,如果您的浮点数在[0,1]范围内),请尝试使用{ {1}}无处不在。这可能允许编译器做更好的优化。答案 1 :(得分:1)
您尚未显示完整算法,但整数和浮点数之间的转换操作非常慢。消除此操作并仅使用一种类型(如果可能的话,最好是整数)可以大大提高性能。
另外,您可以使用lrint()
按照here的说明进行转换。