저는 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의 범위에 있습니다. 여기에 누락 된 프로세서가 있습니까? 카운터의 클럭 속도가 프로세서의 클럭 속도와 다른가요?
멋지다. 게시 한 코드는 2 년 전에 작성한 코드와 정확히 일치합니다. 궁금한 점은 어디에서 가져 왔습니까? –
안녕하세요 닐스, 그건 당신의 코드이고 저는 그 당시의 주제를 인용했습니다 ;-) 당신은 타이머 값에 5의 인자를 얻는 이유를 알고 있습니까? 감사합니다 – user1207228
잠자리 대신 잠깐 동안 실제 작업을한다면 측정 된 시간이 바뀌나요? –