自己的 rowwise addition/subtraction 表现

Eigen rowwise addition/subtraction performance

在分析我的程序时,我发现以下几行是瓶颈

// Some big nested loop
{
    const auto inpRow = inpMap.row(counter);
    outMap.row(adjRow) -= inpRow;
    outMap.row(colInd) += inpRow;
}

outMapinpMapEigen::Map<Eigen::MatrixRX<Scalar>> 其中 Eigen::MatrixRX 定义为 Eigen::Matrix<Scalar, -1, -1, Eigen::RowMajor> 即行主矩阵。

有没有办法提高此类操作的性能? (当然 parallel for 除外)

您无能为力,因为此类表达式应该已经完全矢量化了。不过这里有一些提示:

  • 确保您启用了编译器优化,-O3 -march=native
  • 然后测量它所花费的时间并计算 FLOPS 以查看您距离 CPU 的理论峰值性能有多远(为该实验禁用涡轮增压)
  • 如果您离理论峰值很远,那么您很可能会遇到缓存未命中问题。您可以通过将两个分配拆分为小于 16kB 的块来减少它们。您可能会从中获得高达 x2 的加速。