当前位置: 首页 > 面试题库 >

跨CPU内核的rdtsc准确性

耿招
2023-03-14
问题内容

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

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

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

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

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

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

问题答案:

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可以用于壁钟,则可以保证它们是同步的。



 类似资料:
  • 问题内容: 我想在特定时间获取CPU周期。我当时使用此功能: (编者注:是错的x86-64,捡起 _任何_RDX或RAX仅在32位模式下将它挑EDX:你想EAX输出中看到的。 问题是它总是返回一个 递增的 数字(每次运行)。好像是在指绝对时间。 我使用的功能不正确吗? 问题答案: 只要您的线程停留在相同的CPU内核上,RDTSC指令就会一直返回递增的数字,直到它回绕为止。对于2GHz CPU,这种

  • 问题内容: 假设我的应用程序运行2个线程(例如渲染线程和游戏更新线程)。如果它运行在具有多核CPU的移动设备上(当今通常是这样),我是否可以期望在可能的情况下自动将线程分配给不同的内核? 我知道底层的OS内核(Android linux内核)决定调度。我的问题是我是否需要做 任何其他事情 才能启用多核功能,还是自动而透明的? 问题答案: 您需要做的是允许两个线程尽可能独立地运行。如果您有两个始终在

  • 2.1 准备内核头文件 内核头文件是Linux内核的源代码。有时候,用户需要编译内核头文件代码,为以后使用内核头文件做准备,本节将介绍编译内核头文件的详细步骤。 准备内核头文件的具体操作步骤如下所示。 (1)更新软件包列表。执行命令如下所示: [email protected]:~# apt-get update 输出结果如下所示: Binary 20130905-08:50] kali/non

  • 问题内容: 我正在寻找Redis,以便为我提供一个中间高速缓存存储,其中包含有关交集和并集之类的集合操作的大量计算信息。 我查看了redis网站,发现redis不是为多核CPU设计的。我的问题是,为什么会这样呢? 另外,如果是,我们如何在多核CPU上使用Redis来100%利用CPU资源。 问题答案: 我查看了redis网站,发现redis不是为多核CPU设计的。 我的问题是,为什么会这样? 这是

  • 本文向大家介绍如何在C#中找到CPU内核数?,包括了如何在C#中找到CPU内核数?的使用技巧和注意事项,需要的朋友参考一下 我们可以获得与处理器有关的几条不同的信息 物理处理器数量 核心数 逻辑处理器数量 这些都可以有所不同。对于具有2个启用双核超线程的处理器的计算机,有2个物理处理器,4个内核和8个逻辑处理器。 逻辑处理器的数量可通过Environment类获得,但其他信息仅可通过WMI获得(并

  • (在单CPU的情况下)为了理解volatile——我知道volatile强制线程使用主内存,并且不会将副本保留在其本地内存中。 在一篇StackOverFlow帖子中,我看到java线程使用CPU缓存,而使用volatile则会强制使用主内存 线程缓存和Java内存模型。 如果是这种情况,那么应该没有内存可见性的问题,因为一个线程可以看到其他线程写的值(假设在单个核心CPU上,我们将有单个缓存)。