多核时钟计数器一致性
Multicore clock counter consistency
我正在尝试测量内核模块中两个时间点之间时钟计数器的差异。我使用以下名为 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
.
因此,我认为如果内核模块在两个时间点之间从一个内核移动到另一个内核,那么两个内核之间的一致性就会受到损害,我无法获得正确的时钟差异。
我的想法对吗?如果是,有没有办法修复它(例如修复内核模块而不是将内核移动到内核?)
链接的评论之一提到设置进程关联可以实现你想要的。我还建议制作一个自定义版本的 get_ccnt()
,从而将 RDTSC 替换为 RDTSCP。后者是前者的变体,它还 returns 带有循环计数器的 cpuid。您可以检查您的初始测量的 cpuid 是否等于最终测量的 cpuid。
查看 this Intel manual 的第 3.2 节。请务必先进行测试以验证您的处理器是否支持此指令。
我正在尝试测量内核模块中两个时间点之间时钟计数器的差异。我使用以下名为 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
.
因此,我认为如果内核模块在两个时间点之间从一个内核移动到另一个内核,那么两个内核之间的一致性就会受到损害,我无法获得正确的时钟差异。
我的想法对吗?如果是,有没有办法修复它(例如修复内核模块而不是将内核移动到内核?)
链接的评论之一提到设置进程关联可以实现你想要的。我还建议制作一个自定义版本的 get_ccnt()
,从而将 RDTSC 替换为 RDTSCP。后者是前者的变体,它还 returns 带有循环计数器的 cpuid。您可以检查您的初始测量的 cpuid 是否等于最终测量的 cpuid。
查看 this Intel manual 的第 3.2 节。请务必先进行测试以验证您的处理器是否支持此指令。