时间戳计数器

时间:2010-11-02 07:37:46

标签: linux rdtsc

我通过查询寄存器在我的C ++程序中使用时间戳计数器。但是,我遇到的一个问题是获取时间戳的功能将从不同的CPU获取。我怎样才能确保我的函数始终从同一个CPU获取时间戳,或者无论如何都要同步CPU?顺便说一句,我的程序运行在Fedora 13 64位的4核服务器上。

感谢。

3 个答案:

答案 0 :(得分:4)

请查看以下英特尔手册的摘录。根据16.12节,我认为下面的“更新的处理器”指的是比奔腾4更新的任何处理器。如果支持,你可以使用rdtscp指令同时和原子地确定tsc值和核心ID。我没有尝试过。祝你好运。

Intel 64和IA-32架构软件开发人员手册

第3卷(3A和3B):系统编程指南:

第16.12.1章不变的TSC

较新处理器中的时间戳计数器可能支持增强功能 作为不变的TSC。处理器对不变TSC的支持表示为 CPUID.80000007H:EDX [8]

不变的TSC将在所有ACPI P-,C-中以恒定速率运行。和T状态。这是 建筑行为向前发展。在具有不变TSC的处理器上 支持,操作系统可以使用TSC作为挂钟定时器服务(而不是ACPI或 HPET计时器)。 TSC读取效率更高,不会产生开销 与环转换或访问平台资源相关联。

英特尔还有关于代码执行基准测试的指南,该指南讨论了与rdtsc的cpu关联 - http://download.intel.com/embedded/software/IA/324264.pdf

答案 1 :(得分:1)

根据我的经验,完全避免使用TSC是明智的,除非您真的想要测量单个内核/ CPU上的各个时钟周期。

TSC的潜在问题:

  • 频率缩放。计数器不随时间线性增加......
  • 不同CPU /核心上的不同时钟(我不排除不同CPU上的不同频率缩放,甚至不同的时钟CPU - 尽管后者应该很少见。)
  • 不同CPU /核心上的非同步计数器(即使它们使用相同的频率)。

这基本上归结为只能在单线程应用程序中使用TSC来测量单个CPU上经过的CPU周期(未经过的时间),如果,则强制线程的亲和力

首选方案是使用系统功能。最便携(在Unix / Mac上)是gettimeofday(),通常非常准确。更合适的功能可能是clock_gettime(),但请先检查系统是否支持它。在Windows下,您可以安全地使用QueryPerformanceCounter()

答案 2 :(得分:0)

您可以使用sched_setaffinity或cpuset功能来创建cpuset并将任务分配给该组。