为什么 gprof 不计算 matmul?

Why doesn't gprof count matmul?

我使用 gprof 分析我的 Fortran 代码,我有两个主要的子例程 subroutine Asubroutine B。我 运行 每个例程 10x,然后平均运行时间。这两个例程都使用 matmul,但 subroutine B 更多。

当我在 link 使用 -fexternal-blas 打印运行时时,我得到:

Average time taken for routine A ....    0.41080 seconds
Average time taken for routine B ....    2.28760 seconds

当我不使用 -fexternal-blas 打印运行时时,我得到:

Average time taken for routine A ....    0.41930 seconds
Average time taken for routine B ....    7.40090 seconds

所以我知道矩阵乘法是运行时的一个非常大的原因。

然而,当我使用 gprof 进行分析时,它告诉我 subroutine A 占用了 42.4% 的时间。如果我不 link 到 BLAS,它给了我 41.12%,这没什么不同。

我已将 subroutine A 分成各种较小的例程,以便我可以进行基准测试并找出哪个例程花费的时间最长。不过,我认为我没有得到正确的分析,因为我知道 matmul 没有被包括在内。我想包括 matmul,因为有很多次我必须使用 transposereshape,而其他时候我可以做其他事情时我依赖矩阵乘法,所以如果我发现某个例程中的 matmul 是重量级的,我也许可以调整一下。

这是因为你没有检测 matmul

当您使用适当的 gprof 标志(-pg 用于 gnu 编译器)进行编译时,编译器会在目标文件中添加额外的指令来执行您感兴趣的计时。这称为 "instrumentation"。然而,matmul 来自编译器附带的例程库 - 它已经编译,因此仅在 link 阶段出现。因此,没有添加仪器,gprof 没有报告 matmul 的任何内容。

如果你想在配置文件中包含 matmul,你必须做一些事情,比如找到编译器库和外部 blas 的源代码,用工具编译它,然后 link 反对它而不是常规编译器库。