Измерьте время выполнения на ARM Cortex-A8, используя аппаратный счетчик - PullRequest
7 голосов
/ 21 марта 2012

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

[1] Как измерить время выполнения программы в процессоре ARM Cortex-A8?

Я загрузил модуль ядра, чтобы разрешить чтение значений регистра в режиме пользователя. Я использую следующую программу для проверки счетчика:

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. Есть ли какой-то конкретный процессор, который мне здесь не хватает? Отличается ли тактовая частота счетчиков от тактовой частоты процессора?

Ответы [ 2 ]

1 голос
/ 23 апреля 2012

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

0 голосов
/ 09 декабря 2013

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

...