Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multicore clock counter consistency

I am trying to measure a difference of clock counters between two time points at a kernel module. I use the following function named get_ccnt() to get a clock counter value at a certain time:

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
}

What I concern is, I am using HP EliteBook 2530p in which Intel Core 2 Duo SL9400 (spec. reference)

I heard that CPUs after Nehalem has a consistent clock counter over all cores. (If I get wrong, please point it out.) But, Intel Core 2 Duo SL 9400 has a code name Penryn.

Thus, I think if a kernel module moves from one core to another between two time points, then consistency between two cores is compromised and I can't get a right clock difference.

Is it right what I am thinking? If it is, is there a way to fix it (e.g. fix a kernel module not to move a core to a core?)

like image 891
Jeon Avatar asked Jun 15 '15 14:06

Jeon


1 Answers

One of the comments linked mentions that setting the process affinity can achieve what you want. I would also suggest making a custom version of get_ccnt() whereby replacing RDTSC with RDTSCP. The latter is a variant of the former which also returns the cpuid with the cycle counter. You could check that your initial measurement's cpuid is equal to the final measurement's cpuid.

Have a look at Section 3.2 of this Intel manual. Be sure to make a test first to verify that your processor supports this instruction.

like image 177
hayesti Avatar answered Oct 05 '22 12:10

hayesti