自己的 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;
}
outMap
和 inpMap
是 Eigen::Map<Eigen::MatrixRX<Scalar>>
其中 Eigen::MatrixRX
定义为 Eigen::Matrix<Scalar, -1, -1, Eigen::RowMajor>
即行主矩阵。
有没有办法提高此类操作的性能? (当然 parallel for
除外)
您无能为力,因为此类表达式应该已经完全矢量化了。不过这里有一些提示:
- 确保您启用了编译器优化,
-O3 -march=native
- 然后测量它所花费的时间并计算 FLOPS 以查看您距离 CPU 的理论峰值性能有多远(为该实验禁用涡轮增压)
- 如果您离理论峰值很远,那么您很可能会遇到缓存未命中问题。您可以通过将两个分配拆分为小于 16kB 的块来减少它们。您可能会从中获得高达 x2 的加速。
在分析我的程序时,我发现以下几行是瓶颈
// Some big nested loop
{
const auto inpRow = inpMap.row(counter);
outMap.row(adjRow) -= inpRow;
outMap.row(colInd) += inpRow;
}
outMap
和 inpMap
是 Eigen::Map<Eigen::MatrixRX<Scalar>>
其中 Eigen::MatrixRX
定义为 Eigen::Matrix<Scalar, -1, -1, Eigen::RowMajor>
即行主矩阵。
有没有办法提高此类操作的性能? (当然 parallel for
除外)
您无能为力,因为此类表达式应该已经完全矢量化了。不过这里有一些提示:
- 确保您启用了编译器优化,
-O3 -march=native
- 然后测量它所花费的时间并计算 FLOPS 以查看您距离 CPU 的理论峰值性能有多远(为该实验禁用涡轮增压)
- 如果您离理论峰值很远,那么您很可能会遇到缓存未命中问题。您可以通过将两个分配拆分为小于 16kB 的块来减少它们。您可能会从中获得高达 x2 的加速。