2016-08-19 69 views
1

我想分析一些C代码,但最直观的代价高的函数之一没有显示在GProf输出中。从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()涉及线程之间的大量通信,我觉得这是算法的昂贵部分。它在初始化过程中被调用,然后在算法的循环过程中被重复调用。

即使我知道它从propagate()内部被称为1000+次,GProf只显示1个呼叫到haloSwap(初始化期间)。

propagate()显示为代码中最昂贵的部分,但我想知道它是xyz循环还是MPI comminucation。

有没有人知道为什么从propagate呼叫haloSwap似乎忽略了呼叫数量和功能花费的时间?

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

如果我在呼叫propagate(而不是内部呼叫)后将haloSwap的呼叫移动到主循环,GProf仍然只显示1个呼叫。

+1

您可能正在使用optimisations进行编译,而'propagate()'最终被内联。告诉你的编译器不要内联函数。例如,对于GCC,选项是“-fno-inline”。 –

+1

添加到@Hristo_Iliev评论。 mpicc(来自MPICH)包装器使用包含-finline-small-functions标志的-O2优化。如果您想要从任何优化中排除函数,请在函数上使用gcc属性,例如 void haloSwap()__attribute __(optimize(“ - O0”)) – Angelos

+1

如果您正在使用MPI,那么它正在执行I/O ,并且gprof众所周知是盲目的,因为采样在I/O期间暂停。你可能花99%的时间在I/O上,但gprof不会显示它。任何称自己为“CPU分析器”的东西都是如此。 –

回答

1

@Hristo_Iliev和@Angelos是正确的,我用的优化编译和我的问题是用-O0编译解决。愚蠢的错误,我确信我以前做过。

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% [email protected] 
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 
+2

我这样[*不赞同*](http://programmers.stackexchange.com/a/329124/2429)。 –

+0

我需要关于正在被内联的特定功能的信息,这是我忽视的。 –