我正在尝试分析一些C代码,但其中一个最直观的代价是没有出现在GProf输出中。
int main() {
initialise...
haloSwap();
for(...) {
functions...
propagate();
functions...
}
}
void propagate() {
for (x)
for (y)
for (z)
grid[xNew][yNew][zNew] = grid[x][y][z];
haloSwap();
}
void haloSwap() {
// Horizontal swap
create buffers...
MPI_Sendrecv(buffers);
recreate grid from buffers...
// Vertical swap
create buffers...
MPI_Sendrecv(buffers);
recreate grid from buffers...
}
希望伪代码能够解释设置。 haloSwap()
涉及线程之间的大量通信,我觉得它是算法的一个昂贵的部分。它在初始化期间调用,然后在算法循环期间反复调用。
GProf只显示对haloSwap
的1次调用(在初始化期间),即使我知道它在propagate()
内被调用1000次以上。
propagate()
显示为代码中最昂贵的部分,但我想知道它是xyz循环还是MPI comminucation。
有谁知道为什么来自haloSwap
的{{1}}来电在呼叫次数和功能花费的时间上似乎都被忽略了?
propagate
是在另一个.c文件中定义的,可能是一个因素?
如果我在调用haloSwap
后调用haloSwap
到主循环(而不是在其中),GProf仍然只显示1次调用。
答案 0 :(得分:2)
@Hristo_Iliev和@Angelos是正确的,我正在进行优化编译,我的问题通过使用-O0进行编译来解决。愚蠢的错误,我敢肯定我以前做过。
答案 1 :(得分:2)
启用优化的分析绝对不是一个愚蠢的错误。它取而代之的是一个应该配置文件的方式 - 否则你将浪费时间和精力,手动优化编译器可以为你修复的例程。
如果您需要与gprof提供的不同的个人资料报告,google performance tools(也称为gperftools)可能对您有用。报告将记录内联函数所花费的时间。以下是一个示例报告,您可以在其中查看Google工具如何报告内联功能:
% ~/soft/gperftools/bin/pprof --text \
bigio_mpi bigio-profiling/prof-ca-fill-inline1-0.out| head -10
Using local file bigio_mpi.
Using local file bigio-profiling/prof-ca-fill-inline1-0.out.
Total: 29680 samples
10837 36.5% 36.5% 24056 81.1% ADIOI_P2PContigReadAggregation
3534 11.9% 48.4% 3534 11.9% _init@3a858
2954 10.0% 58.4% 2954 10.0% unshuffle_sse2
2448 8.2% 66.6% 2448 8.2% __memcpy_ssse3
1742 5.9% 72.5% 2661 9.0% type_create_contiguous_x (inline)
1373 4.6% 77.1% 1373 4.6% shuffle_sse2
1176 4.0% 81.1% 6205 20.9% ADIOI_Type_create_hindexed_x
1104 3.7% 84.8% 19082 64.3% ADIOI_Get_eof_offset
831 2.8% 87.6% 28184 95.0% ADIOI_Flatten