2012-03-20 4 views
7

저는 Exynos 3110 프로세서 (Nexus S에서 사용되는 1GHz 단일 코어 ARM Cortex-A8)를 사용 중이며 특정 기능의 실행 시간을 측정하려고합니다. I 넥서스 S.에 로이드 4.0.3 실행이 난 사용자 모드 레지스터의 값을 판독하도록 커널 모듈로드하드웨어 카운터를 사용하여 ARM Cortex-A8 실행 시간 측정

[1] How to measure program execution time in ARM Cortex-A8 processor?

에서 방법 노력했다. 다음 프로그램을 사용하여 카운터를 테스트합니다.

static inline unsigned int get_cyclecount (void) 
{ 
    unsigned int value; 
    // Read CCNT Register 
    asm volatile ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(value)); 
    return value; 
} 


static inline void init_perfcounters (int do_reset, int enable_divider) 
{ 
    // in general enable all counters (including cycle counter) 
    int value = 1; 

    // peform reset: 
    if (do_reset) 
    { 
     value |= 2;  // reset all counters to zero. 
     value |= 4;  // reset cycle counter to zero. 
    } 

    if (enable_divider) 
     value |= 8;  // enable "by 64" divider for CCNT. 

    value |= 16; 

    // program the performance-counter control-register: 
    asm volatile ("MCR p15, 0, %0, c9, c12, 0\t\n" :: "r"(value)); 

    // enable all counters: 
    asm volatile ("MCR p15, 0, %0, c9, c12, 1\t\n" :: "r"(0x8000000f)); 

    // clear overflows: 
    asm volatile ("MCR p15, 0, %0, c9, c12, 3\t\n" :: "r"(0x8000000f)); 
} 


int main(int argc, char **argv) 
{ 
    int i = 0; 
    unsigned int start = 0; 
    unsigned int end = 0; 

    printf("Hello Counter\n"); 

    init_perfcounters(1,0); 

    for(i=0;i<10;i++) 
    { 
     start = get_cyclecount(); 
     sleep(1); // sleep one second 
     end = get_cyclecount(); 

     printf("%u %u %u\n", start, end, end - start); 
    } 

    return 0; 
} 

[1]에 따르면 카운터는 각 클럭주기마다 증가합니다. scaling_governor를 userspace로 전환하고 CPU 주파수를 1GHz로 설정하여 시계의 주파수가 Android에서 변경되지 않도록합니다.

프로그램을 실행하면 1 초의 절전 모드가 실행되지만 카운터 값은 예상 1e9 대신 ~ 200e6의 범위에 있습니다. 여기에 누락 된 프로세서가 있습니까? 카운터의 클럭 속도가 프로세서의 클럭 속도와 다른가요?

+1

멋지다. 게시 한 코드는 2 년 전에 작성한 코드와 정확히 일치합니다. 궁금한 점은 어디에서 가져 왔습니까? –

+2

안녕하세요 닐스, 그건 당신의 코드이고 저는 그 당시의 주제를 인용했습니다 ;-) 당신은 타이머 값에 5의 인자를 얻는 이유를 알고 있습니까? 감사합니다 – user1207228

+1

잠자리 대신 잠깐 동안 실제 작업을한다면 측정 된 시간이 바뀌나요? –

답변

1

이 교수의 페이지를 확인하십시오 : http://users.ece.utexas.edu/~valvano/arm/ 그는 시간 /주기 타이머/측정 실행 시간과 관련이있는 여러 가지 예제 프로그램이 모두 있으며 ARM Cortex-M3 기반 마이크로 컨트롤러 용으로 개발되었습니다. 나는 이것이 당신이하고있는 것과 크게 다르지 않기를 바랍니다. 에 관심이 있으실 거라고 생각합니다.

0

거버너가 표준 Linux에서와 같은 방식으로 성능 관리를 위해 Android에서 사용 되었습니까? 그리고 맞춤형 Android 이미지 또는 제조업체가 제공 한 이미지를 사용하고 있습니까? 제조업체가 제공 한 이미지에 저수준 정책이 있다고 가정합니다 (잠자기 또는 모뎀 활동 등에 연결). 수면 코드가 전압과 주파수를 직접 스케일링 할 수도 있습니다. 정책 (또는 거버너)뿐만 아니라 전체 CPUFreq를 비활성화하는 것이 좋습니다.