2012-03-20 5 views
7

Я использую процессор Exynos 3110 (1 ГГц одноядерный ARM Cortex-A8, например, используемый в Nexus S) и пытаюсь измерить время выполнения определенных функций. У меня есть Android 4.0.3 работает на Nexus S. Я попробовал метод изИзмерение времени выполнения на 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 в пользовательское пространство и установил частоту процессора на 1 ГГц, чтобы убедиться, что тактовая частота не изменяется Android.

Если я запустил программу, выполняются спящие 1 секунду, но значения счетчика находятся в диапазоне ~ 200e6 вместо ожидаемого 1e9. Есть ли что-то конкретное процессорное я здесь отсутствует? Является ли тактовая частота счетчиков отличной от тактовой частоты процессора?

+1

Прохладный .. Код, который вы опубликовали, - это именно то, что я написал два года назад. Просто интересно: Откуда у вас это получилось? –

+2

Привет, Нил, это ваш код, и я процитировал эту тему с того времени ;-) У вас есть идея, почему я получаю коэффициент 5 в значениях таймера? Спасибо – user1207228

+1

Изменяется ли измеренное время, если вы выполняете настоящую работу на секунду вместо сна? –

ответ

1

Заканчивать страницу этого профессора: http://users.ece.utexas.edu/~valvano/arm/ Он несколько полного пример программы, которые имеют отношение к времени/периодическим долгожителям/измерениям-выполнения времени, они разработаны для микроконтроллеров на базе ARM Cortex-M3. Надеюсь, это не сильно отличается от того, над чем вы работаете. Я думаю, вас заинтересует Performance.c

0

Вы уверены, что губернаторы используются в Android для управления производительностью так же, как в стандартном Linux? И используете ли вы пользовательский образ Android или тот, который предоставляется производителем? Я бы предположил, что существуют политики более низкого уровня в образце, предоставленном производителем (привязаны к услугам сна или модема и т. Д.). Также может быть, что сон-код напрямую масштабирует напряжение и частоту. Возможно, стоит отключить весь CPUFreq не только политики (или губернаторы).