2012-03-20 19 views
7

Używam procesora Exynos 3110 (1-rdzeniowy jednordzeniowy ARM Cortex-A8, np. Używany w Nexusie S) i próbuję mierzyć czasy wykonania poszczególnych funkcji. Muszę Android 4.0.3 działa na Nexus S. że próbował metody zMierz czas wykonywania na ARM Cortex-A8 używając licznika sprzętowego

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

że załadowany moduł jądra, aby umożliwić odczyt wartości rejestrów w trybie użytkownika. Ja stosując następujący program do badania licznika:

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; 
} 

według [1], licznik jest zwiększany przy każdym cyklu zegara. Przełączyłem scaling_governor na userspace i ustawiłem częstotliwość procesora na 1GHz, aby upewnić się, że częstotliwość zegara nie zmieni się w systemie Android.

Po uruchomieniu programu wykonywane są uśpienia 1 sekundy, ale wartości licznika mieszczą się w zakresie ~ 200e6 zamiast oczekiwanego 1e9. Czy jest tu coś, czego konkretnie brakuje procesora? Czy częstotliwość zegara liczników różni się od częstotliwości taktowania procesora?

+1

Fajnie .. Opublikowany przez Ciebie kod to * dokładnie * kod, który napisałem dwa lata temu ... Zastanawiam się: skąd to masz? –

+2

Cześć Nils, to jest twój kod i cytowałem ten temat od tego czasu ;-) Czy masz jakiś pomysł, dlaczego dostaję współczynnik 5 w wartościach timera? Dzięki – user1207228

+1

Czy zmierzony czas zmienia się, jeśli wykonujesz prawdziwą pracę na sekundę zamiast spać? –

Odpowiedz

1

Zobacz stronę tego profesora: http://users.ece.utexas.edu/~valvano/arm/ Ma wiele pełnych programów przykładowych, które mają do czynienia z czasem/zegarami okresowymi/czasem wykonywania pomiarów, są opracowane dla mikrokontrolerów opartych na ARM Cortex-M3. Mam nadzieję, że nie różni się to od tego, nad czym pracujesz. Myślę, że byłbyś zainteresowany Performance.c

0

Czy jesteś pewien, że regulatory są używane w systemie Android do zarządzania wydajnością w taki sam sposób, jak w standardowym systemie Linux? Czy używasz niestandardowego obrazu systemu Android lub takiego, który jest dostarczany przez producenta? Zakładam, że obowiązują zasady niższego poziomu w obrazie producenta (związanym ze snem lub modemem itp.). Może to być również, że kod uśpienia bezpośrednio skaluje napięcie i częstotliwość. Warto wyłączyć całe CPUFreq, nie tylko zasady (lub regulatory).