【问题标题】:Eigen rowwise addition/subtraction performance特征行加法/减法性能
【发布时间】:2018-11-08 08:33:46
【问题描述】:

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

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

【问题讨论】:

  • 看起来 inpRow 是一个副本,有什么理由不能使用引用代替吗?
  • @JamesMitchell 谢谢你的回答!我不是 100% 确定,但 eigen 应该提供惰性评估的代理对象(类似于块)。所以应该没有副本。但我不确定
  • #define EIGEN_NO_DEBUG?
  • @Rzu 已添加 :(

标签: c++ performance matrix eigen eigen3


【解决方案1】:

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

  • 确保您启用了编译器优化,-O3 -march=native
  • 然后测量所需的时间并计算 FLOPS,以了解您与 CPU 的理论峰值性能相差多远(对该实验禁用 turbo-boost)
  • 如果您离理论峰值很远,那么您很可能会遇到缓存未命中的问题。您可以通过将两个分配分成小于 16kB 的块来减少它们。您可能会因此获得最高 2 倍的加速。

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 2018-03-06
    • 2019-03-26
    • 1970-01-01
    • 2011-03-21
    • 2012-10-20
    • 1970-01-01
    • 2019-12-21
    • 2019-02-28
    相关资源
    最近更新 更多