如果我将本征Matrix3Xf
矩阵myMatrix.middleCols(a, b)
的成员函数与a = 0, b = myMatrix.cols()-1
一起使用,则会导致性能下降。
当然,我通常对a和b使用其他值,但是使用这些值,与普通矩阵进行比较最容易。
这是正常行为吗?是这种情况,因为无法确保对齐并因此无法进行矢量化?我在文档中什么都没找到。
这是示例代码:
Matrix3Xf a_full = Matrix3Xf::Random(3, 400);
Vector3f v = Vector3f::Random();
RowVectorXf b_full = RowVectorXf::Random(400);
volatile int left = 0, right = 399;
auto& a = a_full.middleCols(left, right);
auto& b = b_full.middleCols(left, right);
//auto& a = a_full;
//auto& b = b_full;
for (float f = 0; f < 1000000; f++)
{
b += (v.transpose() * a);
}
cout << b.sum();
使用此代码,我得到8.6s的执行时间。具有a = a_full;并且b = b_ful;不加注释,执行时间为7.8s
答案 0 :(得分:2)
关于与常数相乘:https://godbolt.org/z/a_OEEP。 您确实有一些开销,因为Eigen无法知道您的列是否从对齐位置开始,因此它会乘以一些值直到到达对齐位置。 (此外,最后还有一个清理循环)。如果列数相对较小,则可能会产生重大影响。
此外,MSVC有时有时在内联琐碎函数方面通常很糟糕。通过添加更多的强制内联,很多问题已在开发分支(default
)中得到了解决,但在3.3.x中没有得到解决。