跨CPU核心的rdtsc精度

avn*_*ner 31 linux multicore rdtsc

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

所有测量看起来都很可靠.尽管如此,我仍然担心核心的rdtsc准确性,因为我一直在阅读一些暗示tsc未在核心之间同步的文本.

在维基百科上找到了关于TSC的以下信息

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

我仍然担心核心的累积性,这是我的问题

更多信息

  • 我在Intel nehalem机器上运行我的进程.
  • 操作系统是Linux.
  • 为所有核设置" constant_tsc "cpu标志.

osg*_*sgx 28

X86_FEATURE_CONSTANT_TSC+ X86_FEATURE_NONSTOP_TSCcpuid中的位(edx = x80000007,位#8;检查linux内核的函数以获取更多检查) unsynchronized_tsc

英特尔设计师的vol3b,第16.11.1节不变TSC,它说如下

"16.11.1不变的TSC

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

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

因此,如果TSC可用于挂钟,则可保证它们同步.

  • 您仍应注意:虽然保证tsc在具有此标志的多个核心之间保持一致,但系统可能配备多个CPU. (4认同)
  • @avner,可以通过简单的2线程测试来检查cpu核心/ cpu包之间的tsc变化,它使用共享变量进行"乒乓"并忙于等待事件等待(没有互斥体,只有读/写;也是rdtsc阅读).当线程固定到不同的内核时,它们将为您提供tsc0-tsc1.然后以相反的顺序设置affinity,得到tsc1-tsc0.如果两者相等,则表示同步TSC (3认同)
  • @Suma这个答案的推理是,文档说您可以依靠使用 rdtsc 来获取步行时钟时间,这意味着您必须能够依靠它在核心之间同步。如果这个推理成立,那么它不也适用于 CPU 之间吗? (2认同)