多核时钟计数器一致性

时间:2015-06-15 14:06:46

标签: c assembly x86 cpu-architecture

我正在尝试测量内核模块上两个时间点之间的时钟计数器的差异。我使用以下名为get_ccnt()的函数来获取某个时间的时钟计数器值:

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
}

我关注的是,我使用的是HP EliteBook 2530p,其中Intel Core 2 Duo SL9400(spec. reference

我听说Nehalem之后的CPU在所有内核上都有一致的时钟计数器。 (如果我错了,请指出。)但是,Intel Core 2 Duo SL 9400的代号为Penryn

因此,我认为如果内核模块在两个时间点之间从一个核心移动到另一个核心,那么两个核心之间的一致性就会受到影响,我无法获得正确的时钟差异。

我在想什么?如果是,有没有办法解决它(例如修复内核模块不将核心移动到核心?)

1 个答案:

答案 0 :(得分:1)

其中一条评论提到,设置流程亲和力可以实现您想要的效果。我还建议制作get_ccnt()的自定义版本,用 RDTSCP 替换 RDTSC 。后者是前者的变体,它也返回带有循环计数器的cpuid。您可以检查初始测量的cpuid是否等于最终测量的cpuid。

查看this Intel manual的第3.2节。请务必先进行测试,以确认您的处理器是否支持此说明。