c - GProf 输出中缺少函数

标签 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 通信。

有谁知道为什么从 propagate 调用 haloSwap 似乎忽略了调用次数和函数花费的时间?

haloSwap 是在另一个 .c 文件中定义的,这可能是一个因素?

如果我在调用 propagate 之后将 haloSwap 的调用移动到主循环(而不是在它内部),GProf 仍然只显示对它的 1 次调用。

最佳答案

启用优化的分析绝对不是一个愚蠢的错误。相反,它是一个应该配置文件的方式——否则您将浪费时间和精力手动优化编译器本可以为您修复的例程。

如果您需要一个不同于 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

关于c - GProf 输出中缺少函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39041871/

相关文章:

linux - 错误 ; MPI 上的图像处理

c - 为什么矩阵乘法算法中的循环顺序会影响性能?

c - 使用 gprof 的奇怪分析输出

c++ - 将 gprof 与 makefile 结合使用

iphone - OpenGL ES - glImageProcessing - 移除纹理

c - 无论如何,Switch 语句都会使用默认大小写 - C 初学者

C (或 asm) : how to execute c code stored in memory (copied from labels)

gcc - 如何用gcc编译MPI?

c - MPI_Finalize() 没有完成

c - 主函数之外的 printf 抛出错误