Linux 时间戳计数器 我在我的C++程序中使用时间戳计数器,通过查询登记器。然而,我遇到的一个问题是,获取时间戳的函数将从不同的CPU获取。如何确保我的函数始终从同一个CPU获取时间戳,或者是否存在同步CPU的方法?顺便说一下,我的程序运行在Fedora 13 64位的4核服务器上

Linux 时间戳计数器 我在我的C++程序中使用时间戳计数器,通过查询登记器。然而,我遇到的一个问题是,获取时间戳的函数将从不同的CPU获取。如何确保我的函数始终从同一个CPU获取时间戳,或者是否存在同步CPU的方法?顺便说一下,我的程序运行在Fedora 13 64位的4核服务器上,linux,rdtsc,Linux,Rdtsc,谢谢。您可以使用sched_setaffinity或cpuset功能创建cpuset并将任务分配给该集合 根据我的经验,完全避免TSC是明智的,除非您真的想测量单个内核/CPU上的单个时钟周期 TSC的潜在问题: 频率缩放。计数器不随时间线性增加 不同CPU/内核上的不同时钟(我不排除不同CPU上的不同频率缩放,甚至不同时钟的CPU——尽管后者应该很少) 不同CPU/内核上的非同步计数器(即使它们使用相同的频率) 这基本上可以归结为,如果强制对线程进行关联,则只能使用TSC来测量单线程应用程

谢谢。

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

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

TSC的潜在问题:

  • 频率缩放。计数器不随时间线性增加
  • 不同CPU/内核上的不同时钟(我不排除不同CPU上的不同频率缩放,甚至不同时钟的CPU——尽管后者应该很少)
  • 不同CPU/内核上的非同步计数器(即使它们使用相同的频率)
这基本上可以归结为,如果强制对线程进行关联,则只能使用TSC来测量单线程应用程序中单个CPU上的已用CPU周期(而不是已用时间)


首选的替代方案是使用系统功能。最可移植的(在Unix/Mac上)是,它通常非常精确。更合适的函数可能是,但请先检查您的系统是否支持该函数。在Windows下,您可以安全地使用。

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

英特尔64和IA-32体系结构软件开发人员手册

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

第16.12.1章不变TSC

较新处理器中的时间戳计数器可能支持增强功能,请参阅 作为不变的TSC。处理器对不变TSC的支持由 CPUID.8000007h:EDX[8]

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


英特尔还有一个关于代码执行基准测试的指南,其中讨论了cpu与rdtsc的关联-

您不能说TSC的用途,但要注意,当您的cpu使用频率缩放时,TSC也可能返回意外值。Fabian,您看到意外值了吗?《英特尔手册》对此进行了详细描述,大多数CPU都是“恒定TSC”,不会随频率变化。它不是CPU滴答计数器,而是总线频率*固定乘法器的计数器。在Linux上,gettimeofday和clock_gettime巧妙地转换为库调用(而不是真正的系统调用)它使用rdtsc和缩放/偏移结果,以适合您所使用的确切平台(一些较新的CPU实际上使TSC跨内核同步,或者即使在speedstep操作期间也保持单调)。性能和精度比“经典”UNIX gettimeofday高得多。单物理CPU中不同内核的TSC还是多Socket系统中的内核相同?