我使用Fortran
描述了我的gprof
代码,我有两个主要的子例程subroutine A
和subroutine 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
,因为有很多次我必须使用transpose
,reshape
,而其他时候我依赖于矩阵乘法,当我可以做其他事情时,所以如果我发现特定程序中的matmul
s很重,我可以调整一些东西。
答案 0 :(得分:2)
这是因为你没有使用matmul
使用适当的gprof标志(gnu编译器的-pg)进行编译时,编译器会在目标文件中添加额外的指令,以执行您感兴趣的计时。这称为“检测”。然而,matmul来自编译器附带的例程库 - 它已经被编译,因此只在链接阶段出现。因此,没有添加仪器,gprof也没有报告matmul的内容。
如果要在配置文件中包含matmul,则必须执行以下操作:查找编译器库和外部blas的源代码,使用检测进行编译,然后链接到该文件而不是常规编译器库。