2013-04-14 9 views
10

Obecnie używam funkcji do_gettimeofday() do mierzenia czasu w jądrze, co daje mi dokładność mikrosekundy. Czy jest coś, co jest bardziej precyzyjne niż to (być może rzędu nanosekund)?Czas pomiaru w przestrzeni jądra Linuksa z sub-mikro-sekundową precyzją

+1

Co dokładnie chcesz zmierzyć tak "dokładnie" ...? A twój sprzęt nie jest tak deterministyczny, jak ci się wydaje (luki w pamięci podręcznej mogą często zmieniać czas). –

+0

Chcę zmierzyć czas potrzebny do wykonania określonej operacji na określonym sprzęcie. Zmierzam to w swoim kierowcy. –

Odpowiedz

14

Funkcja zwraca ktime_t, która ma rozdzielczość nanosekund.

+1

Poniższy kod używający tych funkcji wydaje się tworzyć 0: long long int nsTime = ktime_to_ns (ktime_get()); \t printk ("czas rozpoczęcia w ns to% d", nsTime); Każdy pomysł, dlaczego? –

+3

@JohnRoberts: Musisz użyć '% lld', aby wydrukować' long long int'. – caf

+1

@caf: Mam podobny problem, tj. Otrzymuję 0 ns. kod wygląda mniej więcej tak ... Start = ktime_get(); ... Funkcja(); ... end = ktime_get(); actual_time = ktime_to_ns (ktime_sub (end, start)); printk (KERN_INFO "Czas zajęty =% lld \ n", (długa długa) actual_time); –

4

Z tego co wiem, najbardziej dokładnym zegarem powinien być rejestr liczników specyficzny dla procesora (taki jak TSC w x86). Jądro Linux dostarcza makra rdtsc, rdtscl, rdtscll z pliku "./arch/x86/include/asm/msr.h", aby odczytać tę wartość rejestru. Dla ARM, cycle counter register.

Te rejestry różnią się od procesora do procesora. Wspólnym interfejsem dostępu do niego jest funkcja "get_cycles", która jest zadeklarowana w pliku.

Może, this document może być pomocne.

+1

Czy TSC nie jest zbyt wiarygodne, jeśli chodzi o maszyny wielordzeniowe? –

+0

Masz rację. W maszynie wielordzeniowej należy zachować ostrożność przy korzystaniu z rejestru TSC z określonego procesora. – Wonil

Powiązane problemy