2015-06-15 27 views
6

Sto provando a misurare una differenza di contatori di clock tra due punti temporali in un modulo del kernel. Io uso la seguente funzione denominata get_ccnt() per ottenere un controvalore orologio ad una certa ora:Consistenza contatore orologio multicore

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 
} 

Quello che preoccupazione è, io sto usando HP EliteBook 2530p in cui Intel Core 2 Duo SL9400 (spec. reference)

Ho sentito che le CPU dopo lo Nehalem hanno un contatore di clock costante su tutti i core. (Se ho torto, per favore segnalalo.) Ma Intel Core 2 Duo SL 9400 ha un nome in codice Penryn.

Quindi, penso che se un modulo del kernel si sposta da un core ad un altro tra due punti temporali, allora la coerenza tra due core è compromessa e non riesco a ottenere la giusta differenza di clock.

E 'giusto quello che sto pensando? Se lo è, c'è un modo per risolverlo (ad esempio, correggere un modulo del kernel per non spostare un core in un core?)

+0

Ho scoperto [QUESTO] (https://aufather.wordpress.com/2010/09/08/high-performance-time-measuremen-in-linux/) articolo. – LPs

+0

Grazie mille. Sembra che lui/lei cerchi di risolvere il problema legando un processore ad una certa affinità della CPU. Proverò a controllarlo più tardi. – Jeon

+0

L'app non deve essere "passaggio tra core" anche se multi-thread. (Ogni thread viene eseguito in modo indipendente.) Se si prova a profilare due thread su core diversi, è possibile calcolare l'autonomia di ciascun core in modo indipendente e aggiungere entrambi i risultati insieme per un tempo totale. (Supponendo di voler rimanere con RDTSC.) O forzare tutti i thread sullo stesso core. In caso contrario, facendo RDTSC sul thread principale dovrebbe restituire il tempo trascorso corretto per tornare a quel thread, indipendentemente da altri thread. In ogni caso, tuttavia, darà jitter in quanto il kernel/OS li assegna e li esegue come meglio crede. – rdtsc

risposta

1

Uno dei commenti collegati indica che l'impostazione dell'affinità del processo può ottenere ciò che si desidera. Suggerirei anche di creare una versione personalizzata di get_ccnt() in cui sostituire RDTSC con RDTSCP. Quest'ultima è una variante del primo che restituisce anche la CPU con il contatore del ciclo. È possibile verificare che la CPU della misurazione iniziale sia uguale alla CPU della misurazione finale.

Dai un'occhiata alla Sezione 3.2 di this Intel manual. Assicurati di fare un test prima di verificare che il tuo processore supporti questa istruzione.