2015-06-15 13 views
6

Próbuję zmierzyć różnicę liczników zegara między dwoma punktami czasowymi w module jądra. Używam następującą funkcję o nazwie get_ccnt() aby uzyskać wartość licznika zegara w pewnym momencie:Konsola wielodzielcza z zegarem

static __inline__ long long int get_ccnt(void) 
{ 
    #if defined(__i386__) 
     long long int x; 
     __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); 
     return x; 

    #elif defined(__x86_64__) 
     unsigned int hi, lo; 
     __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi)); 
     return ((long long int)lo)|(((long long int)hi)<<32); 

    #endif 
} 

Co ja troską jest, używam HP EliteBook 2530p, w którym Intel Core 2 Duo SL9400 (spec. reference)

Słyszałem, że procesory po Nehalem mają stały licznik zegara nad wszystkimi rdzeniami. (Jeśli się pomyliłem, proszę to wskazać:) Ale Intel Core 2 Duo SL 9400 ma nazwę kodową Penryn.

Tak więc myślę, że jeśli moduł jądra przesunie się z jednego rdzenia do drugiego między dwoma punktami czasowymi, wówczas spójność między dwoma rdzeniami jest zagrożona i nie mogę uzyskać prawidłowej różnicy zegara.

Czy to prawda, o czym myślę? Jeśli tak, czy jest jakiś sposób, aby to naprawić (np. Naprawić moduł jądra, aby nie przenosić jądra do rdzenia?)

+0

Dowiedziałem się o [TYM] (https://aufather.wordpress.com/2010/09/08/high-performance-time-measuremen-in-linux/) artykule. – LPs

+0

Wielkie dzięki. Wygląda na to, że próbuje rozwiązać problem, wiążąc procesor z pewnym powinowactwem procesora. Spróbuję to sprawdzić później. – Jeon

+0

Twoja aplikacja nie powinna "przełączać między rdzeniami", nawet jeśli jest wielowątkowa. (Każdy wątek działa niezależnie.) Jeśli próbujesz profilować dwa wątki na różnych rdzeniach, możesz niezależnie od czasu użycia każdego rdzenia i dodać oba wyniki łącznie przez cały czas. (Zakładając, że chcesz trzymać się RDTSC.) Lub zmuś wszystkie gwinty do tego samego rdzenia. W przeciwnym razie wykonanie RDTSC na głównym wątku powinno zwrócić prawidłowy czas, jaki upłynął, aby powrócić do tego wątku, niezależnie od innych wątków. Daje jitter prawie w każdym przypadku jednak, ponieważ jądro/OS przydziela i uruchamia je według własnego uznania. – rdtsc

Odpowiedz

1

Jeden z komentarzy wskazuje, że ustawienie powinowactwa procesu może osiągnąć to, co chcesz. Proponuję również wykonanie niestandardowej wersji get_ccnt(), w której należy wymienić RDTSC z RDTSCP. Ten drugi jest wariantem pierwszego, który również zwraca cpuid z licznikiem cykli. Można sprawdzić, czy cpuid twojego pierwszego pomiaru jest równy cpuid końcowego pomiaru.

Zobacz dział 3.2 z this Intel manual. Pamiętaj, aby najpierw wykonać test, aby sprawdzić, czy twój procesor obsługuje tę instrukcję.