自己的 middleCols() 惩罚

Eigen middleCols() penalty

如果我将特征 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.6 秒的执行时间。有一个= a_full; b = b_ful;未注释,执行时间为7.8s

关于乘以常数:https://godbolt.org/z/a_OEEP。 你确实有一些开销,因为 Eigen 不知道你的列是否从对齐的位置开始,所以它会乘以一些值直到它到达对齐的位置。 (此外,最后还有一个清理循环)。如果列数相对较少,这可能会产生重大影响。

此外,MSVC 有时 往往不擅长内联琐碎的函数。很多问题在开发分支 (default) 中得到修复,但在 3.3.x 中没有,通过添加更多强制内联。