本征逐行加减性能

时间:2018-11-08 08:33:47

标签: c++ performance matrix eigen eigen3

在对程序进行性能分析时,我发现以下几行是瓶颈

// 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除外)

1 个答案:

答案 0 :(得分:1)

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

  • 确保启用了编译器优化,-O3 -march=native
  • 然后测量所需的时间并计算FLOPS,以了解与CPU的理论峰值性能之间的差距(为此实验禁用涡轮增压)
  • 如果您离理论峰值很远,那么很可能会遭受高速缓存未命中的困扰。您可以通过将两个分配分成小于16kB的块来减少它们。您可能会因此而将速度提高到2倍。