为什么gprof不算matmul?

时间:2015-07-25 02:09:58

标签: fortran gfortran blas gprof

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

当我在与-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%的时间。如果我没有链接到没有太大差异的BLAS,它会给我41.12%。

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

1 个答案:

答案 0 :(得分:2)

这是因为你没有使用matmul

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

如果要在配置文件中包含matmul,则必须执行以下操作:查找编译器库和外部blas的源代码,使用检测进行编译,然后链接到该文件而不是常规编译器库。