对于相同的代码,Oprofile和gprof输出会有所不同

我正在运行我的代码AMD optron 6270机器。 OS是Centos 6.2发行版。 我做了一个简单的程序

#include<stdio.h>
#include<stdlib.h>
int calling (long a);
int calling1 (long a);
int calling2 (long a);
int calling3 (long a);
int calling4 (long a);
int calling5 (long a);

void main()
{
    long a,b=0;
    printf("hi");
    for (a=0; a<10000000; a++) b++;
    b =Calling(a);
    b =Calling5(a);
    b =Calling4(a);

}

int Calling(long a)
{
    long b=0;
    for (a=0; a<100; a++) b = Calling1(a);
    return 0;
}

int Calling1(long a)
{
    long b=0;

    for (a=0; a<10000000; a++) b++;
    b =Calling2(a);
    return 0;
}

int Calling2(long a)
{
    long b=0;
    for (a=0;a<10000000;a++) b++;

    b =Calling3(a);
    return 0;
}
int Calling3(long a)
{
    long b=0;
    for (a=0;a<10000000;a++) b++;
    b =Calling4(a);
    return 0;
}
int Calling4(long a)
{
    long b=0;
    for (a=0; a<10000000; a++) b++;
    return 0;
}

int Calling5(long a)
{
    long b=0;
    for (a=0; a<10000000; a++) b++;
    b=0;
    for (a=0; a<10000000; a++) b++;
    b=0;
    for (a=0 ;a<10000000; a++) b++;
    b=0;
    for (a=0; a<10000000; a++) b++;
    b=0;
    return 0;
}

用gprof和Oprofile技巧来诠释这段代码。 我得到了不同的报告。 比方说,我用gprof运行main.exe两次:第一次报告与gprof平面配置文件:

每个样品计数为0.01秒。

  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name

 24.80      2.96     2.96      101     0.03     0.03  Calling4
 24.71      5.91     2.95      100     0.03     0.12  Calling1
 24.63      8.84     2.94      100     0.03     0.06  Calling3
 23.78     11.68     2.84      100     0.03     0.09  Calling2
  1.01     11.80     0.12        1     0.12     0.12  Calling5
  0.34     11.84     0.04                             main
  0.00     11.84     0.00        1     0.00    11.65  Calling

与gprof第二次报告

平面轮廓:

每个样品计数为0.01秒。

累计自我累计
时间秒秒呼叫s /呼叫s /呼叫名称

 25.13      2.99     2.99      100     0.03     0.12  Calling1
 24.88      5.95     2.96      101     0.03     0.03  Calling4
 24.80      8.89     2.95      100     0.03     0.06  Calling3
 23.48     11.69     2.79      100     0.03     0.09  Calling2
  1.02     11.81     0.12        1     0.12     0.12  Calling5
  0.17     11.83     0.02                             main
  0.00     11.83     0.00        1     0.00    11.66  Calling

两份报告都有所不同。 每次我运行我的main.exe我得到不同的分析报告。 当我尝试Oprofile时,我也得到不同的结果:

Oprofile report1使用/ var / lib / oprofile / samples /获取样本目录。 警告:/ no-vmlinux找不到。 CPU:AMD64系列15h,速度2.2e + 06 MHz(估计)计数CPU_CLK_UNHALTED事件(CPU时钟未停止),单位掩码为0x00(无单位掩码)计数100000

samples  %        image name               symbol name
92552    24.7672  main                     Calling4
91610    24.5151  main                     Calling3
91566    24.5033  main                     Calling1
91469    24.4774  main                     Calling2
3665      0.9808  main                     Calling5
1892      0.5063  no-vmlinux               /no-vmlinux
916       0.2451  main                     main
10        0.0027  libc-2.12.so             profil_counter
1        2.7e-04  ld-2.12.so               _dl_cache_libcmp
1        2.7e-04  ld-2.12.so               _dl_relocate_object
1        2.7e-04  ld-2.12.so               _dl_sysdep_start
1        2.7e-04  ld-2.12.so               strcmp
1        2.7e-04  libc-2.12.so             __libc_fini
1        2.7e-04  libc-2.12.so             _dl_addr
1        2.7e-04  libc-2.12.so             _int_malloc
1        2.7e-04  libc-2.12.so             exit

Oprofile report2

使用/ var / lib / oprofile / samples /作为示例目录。 警告:/ no-vmlinux找不到。 CPU:AMD64系列15h,速度2.2e + 06 MHz(估计)计数CPU_CLK_UNHALTED事件(CPU时钟未停止),单位掩码为0x00(无单位掩码)计数100000

样本%图像名称符号名称

92254    24.7719  main                     Calling4
91482    24.5646  main                     Calling1
91480    24.5641  main                     Calling3
91340    24.5265  main                     Calling2
3658      0.9822  main                     Calling5
1270      0.3410  no-vmlinux               /no-vmlinux
916       0.2460  main                     main
6         0.0016  libc-2.12.so             profil_counter
1        2.7e-04  ld-2.12.so               _dl_lookup_symbol_x
1        2.7e-04  ld-2.12.so               _dl_setup_hash
1        2.7e-04  ld-2.12.so               _dl_sysdep_start
1        2.7e-04  ld-2.12.so               bcmp
1        2.7e-04  libc-2.12.so             __mcount_internal
1        2.7e-04  libc-2.12.so             _dl_addr
1        2.7e-04  libc-2.12.so             _int_free
1        2.7e-04  libc-2.12.so             mcount

任何人都可以告诉他们为什么发生这种情况? 造成这种情况的可能原因是什么? 我如何避免这种情况,以便能够获得恒定的分析结果?


我不会担心随后的报道会有所不同。 取决于程序的执行方式,报告可能会有很大差异。 此外,很难说两个配置文件之间会发生什么。 根据正在运行的其他进程,系统的缓存和TLB肯定会处于与第一个配置文件不同的状态。 除非您可以确保受控制的机器状态,否则不要期望得到一致的结果。

理解为什么每个工具的报告不同意很容易。 这两种工具是根本不同的。 Oprofile是一个基于采样的分析器,实质上是定期中断CPU。 Gprof是基于仪器的; 它必须被编译到你的程序中。 这会产生一个不同的二进制文件,如果没有使用gprof,它将会运行。 因此,gprof将高估时间。 对于CPU绑定的进程使用oprofile,对于I / O绑定的进程使用gprof。

链接地址: http://www.djcxy.com/p/43863.html

上一篇: Oprofile and gprof output varies for same code

下一篇: understanding the output of gprof on solaris