GProf 输出中缺少函数
Missing function from GProf output
我正在尝试分析一些 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 次调用。
@Hristo_Iliev 和@Angelos 是正确的,我在编译时进行了优化,我的问题通过使用 -O0 进行编译得到了解决。愚蠢的错误,我确定我以前犯过。
启用优化的分析绝对不是一个愚蠢的错误。相反,它是一个 应该 配置文件的方式——否则你将浪费时间和精力手动优化编译器本可以为你修复的例程。
如果您需要不同于 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 输出中。
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()
.
propagate()
显示为代码中最昂贵的部分,但我想知道它是 xyz 循环还是 MPI 通信。
有谁知道为什么从 propagate
到 haloSwap
的调用似乎在调用次数和函数花费的时间上都被忽略了?
haloSwap
是在另一个.c 文件中定义的,这可能是一个因素?
如果我在调用 propagate
之后将 haloSwap
的调用移动到主循环(而不是在主循环中),GProf 仍然只显示对它的 1 次调用。
@Hristo_Iliev 和@Angelos 是正确的,我在编译时进行了优化,我的问题通过使用 -O0 进行编译得到了解决。愚蠢的错误,我确定我以前犯过。
启用优化的分析绝对不是一个愚蠢的错误。相反,它是一个 应该 配置文件的方式——否则你将浪费时间和精力手动优化编译器本可以为你修复的例程。
如果您需要不同于 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