GProf输出中缺少功能

时间:2016-08-19 14:43:26

标签: c mpi gprof

我正在尝试分析一些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次调用。

2 个答案:

答案 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