一尘不染

跨CPU内核的rdtsc准确性

linux

我正在从一个线程发送网络数据包,并收到在不同CPU内核上运行的第二个线程的答复。我的过程测量每个数据包的发送和接收之间的时间(类似于ping)。我正在使用rdtsc来获取高分辨率,低开销的时序,这是我的实现所需的。

所有测量看起来都是可靠的。尽管如此,我仍担心rdtsc在内核之间的准确性,因为我一直在阅读一些文字,这些文章暗示tsc在内核之间不同步。

在维基百科中找到了有关TSC的以下信息

稳定的TSC行为可确保 每个时钟滴答的持续时间均匀,并支持将TSC用作挂钟计时器,即使处理器内核更改频率也是如此
。这是面向所有英特尔处理器的架构行为。

我仍然担心核心的准确性,这是我的问题

更多信息

  • 我在Intel nehalem机器上运行我的过程。
  • 操作系统是Linux。
  • 为所有内核设置了“ constant_tsc ” cpu标志。

阅读 462

收藏
2020-06-02

共1个答案

一尘不染

X86_FEATURE_CONSTANT_TSC+ X86_FEATURE_NONSTOP_TSCcpuid中的位(edx =
x80000007,位#8;Linux内核的检查功能以进行更多检查)
unsynchronized_tsc

英特尔设计师的vol3b,第16.11.1节“不变型TSC”中表示以下内容

“ 16.11.1不变式TSC

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

不变的TSC将在所有ACPI
P-,C-中以恒定速率运行。和T状态。这是前进的架构行为。在具有不变TSC支持的处理器上,OS可以将TSC用于壁钟计时器服务(而不是ACPI或HPET计时器)。TSC读取效率更高,并且不会产生与环转换或访问平台资源相关的开销。”

因此,如果TSC可以用于壁钟,则可以保证它们是同步的。

2020-06-02