Estoy tratando de medir una diferencia de contadores de reloj entre dos puntos de tiempo en un módulo del kernel. Uso la siguiente función llamada get_ccnt() para obtener un valor de contador de reloj en un momento determinado:
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 }Lo que me preocupa es que estoy usando HP EliteBook 2530p en el que Intel Core 2 Duo SL9400 ( referencia de especificación)
Escuché que las CPU después de Nehalem tienen un contador de reloj constante en todos los núcleos. ( Si me equivoco, indíquelo). Sin embargo, Intel Core 2 Duo SL 9400 tiene un nombre en clave Penryn .
Por lo tanto, creo que si un módulo del núcleo se mueve de un núcleo a otro entre dos puntos de tiempo, la consistencia entre dos núcleos se ve comprometida y no puedo obtener una diferencia de reloj correcta.
¿Es correcto lo que estoy pensando? Si es así, ¿hay alguna forma de arreglarlo (por ejemplo, arreglar un módulo del kernel para que no mueva un núcleo a otro núcleo?)
Uno de los comentarios vinculados menciona que establecer la afinidad del proceso puede lograr lo que desea. También sugeriría hacer una versión personalizada de get_ccnt() reemplazando RDTSC con RDTSCP . Este último es una variante del primero que también devuelve el cpuid con el contador de ciclos. Puede verificar que el cpuid de su medición inicial sea igual al cpuid de la medición final.
Eche un vistazo a la Sección 3.2 de este manual de Intel . Asegúrese de hacer una prueba primero para verificar que su procesador admita esta instrucción.