1

我正在使用 Callgrind 来查看调用特定函数的次数。但是,我也对执行时间感兴趣。

我知道程序在 Callgrind 上运行时需要更长的时间,因为它必须获取信息。然而,令我惊讶的是时间的变化。就我而言,我在 2D 和 3D 网格上运行两个不同版本的快速行进方法(FMM 和简化 FMM)。结果如下:

在此处输入图像描述

在 2D 中,FMM/SFMM 的比率根本没有保留,但至少它总是 >1(FMM 总是比 SFMM 花费更长的时间)。然而,在 3D 中 Callgrind 的效果完全相反,时代完全改变了:SFMM 需要更短的 callgrind 但在常规执行中需要更长的时间。

我正在使用的编译(-Ofast,-fno-finite-math-only)一直是相同的,并且相同的二进制文件在 callgrind 和常规运行的 ./bin-name 中运行

时间测量函数来自 std::chrono。

因此,问题是:由于我在所有情况下都使用相同的二进制文件,相同的二进制文件怎么可能表现得如此不同?在这种情况下,我获得的其他数据(函数调用、时间成本百分比等)是否可靠?使用常规执行命令运行二进制文件时,预期会出现类似 Callgrind 的结果。

编辑:在实现中,主要变化是在 FMM 中我使用的是 Boost Fibonacci 堆,而在 SFMM 中我使用的是带有 Boost 优先级队列的小修改。

谢谢!

4

0 回答 0