【问题标题】:Time Stamp Counter时间戳计数器
【发布时间】:2010-11-02 07:37:46
【问题描述】:

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

谢谢。

【问题讨论】:

  • 您没有说您使用 TSC 的目的是什么,但请注意,当您的 CPU 使用频率缩放时,TSC 也可能返回意外值。
  • Fabian,你看到意外了吗?期望在英特尔手册中有完整描述,大多数 CPU 是“恒定 TSC”,不会随频率而变化。而且它不是 CPU 滴答计数器,而是 Bus Freq*fixed multiplier 的计数器。

标签: linux rdtsc


【解决方案1】:

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

英特尔 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 读取效率更高,并且不会产生开销 与环形转换或对平台资源的访问相关联。

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

【讨论】:

  • 单个物理 CPU 中不同核的 TSC 或多路系统中的核的 TSC 是否相同?
【解决方案2】:

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

TSC 的潜在问题:

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

这基本上归结为您只能使用 TSC 来测量单线程应用程序中单个 CPU 上经过的 CPU 周期(而不是经过的时间),如果您强制线程的亲和性.

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

【讨论】:

  • 在 Linux 上 gettimeofday 和 clock_gettime 被巧妙地转换为库调用(而不是真正的系统调用),它们使用 rdtsc 并根据您正在使用的确切平台缩放/偏移结果(一些较新的 CPU实际上让 TSC 跨内核同步,或者即使在 speedstep 操作期间也保持单调)。性能和准确性远高于“经典”UNIX gettimeofday。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多