2013-02-22 10 views
1

AMD optron 6270 컴퓨터에서 코드를 실행하고 있습니다. OS는 CentOS 6.2 릴리스입니다. gprof의와 현재 Oprofile이 코드를 profinling 동안 나는동일한 코드에 대해 Oprofile 및 gprof 출력이 다릅니다.

#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를 사용하여 main.exe를 두 번 실행한다고 가정 해 보겠습니다. gprof로 첫 번째 보고서 평면 프로필 :

각 샘플은 0.01 초로 계산됩니다. gprof의와

% 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 

2 차 보고서

플랫 프로필 : 0.01 초와 같은

각 샘플 계산됩니다.

% 누적자가 자기 총
시간 초 초 통화의/콜 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의 family15h 속도 2.2E + 06 MHz의 (예상) × 00 (단위 없음 마스크)의 단위 마스크 카운트 된 CPU_CLK_UNHALTED 이벤트 (CPU의 클럭이 중지됨 생략) 100,000

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의 family15h 속도 2.2E + 06 MHz의 (예상) × 00 (단위 없음 마스크)의 단위 마스크 카운트 된 CPU_CLK_UNHALTED 이벤트 (CPU의 클럭이 중지됨 생략) 카운트 100,000

샘플 % 화상 이름 심볼 이름

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 

왜 이런 일이 일어날 수 있습니까? 이럴 수있는 원인은 무엇입니까? 어떻게이 상황을 피할 수있어 지속적인 프로파일 링 결과를 얻을 수 있습니까?

+0

이것은 확률 론적 과정입니다. 측정치가 정확하게 반복 될 수 있다면 버그 일 것입니다. 큰 그림을보세요. –

+0

OS는 테스트 중에 다른 프로세스, I/O 등으로 가득 차 있습니다. 테스트 중 시스템 상태가 후속 테스트 중 상태와 일치 함을 보장하는 것은 불가능합니다. 시스템을 단일 사용자 모드로 설정하면 타이밍이 달라질 수 있습니다. – suspectus

+0

정확한 결과를 얻을 수있는 방법이 있습니까? 그래서 만약 내가 작은 최적화 (5ms)를하고 있다면 보고서에서 볼 수 있어야합니다. –

답변

2

나는 다른 후속 보고서에 대해 염려하지 않을 것입니다. 프로그램 실행 방법에 따라 보고서가 크게 다를 수 있습니다. 게다가, 두 프로파일간에 어떤 일이 발생하는지에 관해 많이 말하기는 어렵습니다. 실행중인 다른 프로세스에 따라 시스템의 캐시와 TLB가 첫 번째 프로필과 다른 상태에있을 것입니다. 통제 된 시스템 상태를 보장 할 수 없다면 일관된 결과를 기대하지 마십시오.

각 도구의 보고서가 왜 동의하지 않는지 간단합니다. 두 도구는 근본적으로 다릅니다. Oprofile은 본질적으로 주기적으로 CPU를 인터럽트하는 샘플링 기반 프로파일 러입니다. Gprof는 계측 기반입니다. 프로그램에 컴파일해야합니다. gprof를 사용하지 않은 경우 다른 바이너리가 생성됩니다. 결과적으로 gprof는 타이밍을 추정합니다.CPU 바인딩 프로세스에는 oprofile을 사용하고 I/O 바인딩 프로세스에는 gprof를 사용하십시오.