【问题标题】:Multicore clock counter consistency多核时钟计数器一致性
【发布时间】:2015-08-31 01:45:46
【问题描述】:

我正在尝试测量内核模块中两个时间点之间时钟计数器的差异。我使用以下名为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

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

我的想法对吗?如果是,有没有办法修复它(例如修复内核模块不将内核移动到内核?)

【问题讨论】:

  • 我发现了THIS的文章。
  • 非常感谢。似乎他/她试图通过将处理器绑定到某个 CPU 亲和性来解决问题。我稍后会尝试检查。
  • 即使是多线程的,您的应用也不应该“在内核之间切换”。 (每个线程独立运行。)如果尝试分析不同内核上的两个线程,您可以独立计算每个内核的使用时间,并将两个结果加在一起总时间。 (假设你想坚持使用 RDTSC。)或者强制所有线程在同一个核心上。否则,在主线程上执行 RDTSC 应该返回正确的经过时间以返回到该线程,而不管任何其他线程。然而,它几乎在所有情况下都会产生抖动,因为内核/操作系统会按照它认为合适的方式分配和运行它们。
  • @rdtsc 您的名字使您的回答值得信赖。非常感谢。我会检查它我有时间。
  • 请适当标记您的问题。这与 C 作为您表达程序的语言(甚至不是 C)几乎没有关系,但与您的操作系统有很大关系。 “内核”是适合你的 linux 内核吗?

标签: c assembly x86 cpu-architecture


【解决方案1】:

其中一个 cmets 链接提到设置进程亲和力可以实现您想要的。我还建议制作 get_ccnt() 的自定义版本,从而将 RDTSC 替换为 RDTSCP。后者是前者的变体,它还返回带有循环计数器的 cpuid。您可以检查初始测量的 cpuid 是否等于最终测量的 cpuid。

查看this Intel manual 的第 3.2 节。请务必先进行测试以验证您的处理器是否支持此指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 2019-03-08
    • 2022-09-30
    • 1970-01-01
    • 2012-04-04
    • 2011-02-06
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多