【问题标题】:Is there any high resolution clock (us) in User space (Linux)?用户空间(Linux)中是否有任何高分辨率时钟(我们)?
【发布时间】:2019-11-19 06:13:42
【问题描述】:

您是否知道任何用于 Linux 的用户空间中高分辨率时钟(最小微秒)的 C/C++ 实现(即使它不可移植)?

目标是测量一些低延迟操作的时间间隔。 我测量了内核空间时钟有时会导致延迟峰值。

根据我对 Red Hat 7.2 的研究:

  • std::chrono::high_resolution_clock 最大分辨率为毫秒;
  • clock_gettime CLOCK_MONOTONIC 和 CLOCK_REALTIME 通过内核系统调用执行;
  • gettimeofday 通过内核系统调用执行;
  • clock_gettime CLOCK_MONOTONIC_COARSE 和 CLOCK_REALTIME_COARSE 在用户空间执行,但最大分辨率为毫秒;

谢谢。

【问题讨论】:

  • 目标是测量一些低延迟操作的时间间隔。我测量了内核空间时钟有时会导致延迟峰值。 做到这一点的诀窍是进行大量调用。如果您进行十亿次呼叫,即使获得时间的成本是一秒,十亿次呼叫也是一秒,因此平均每次呼叫需要 1 纳秒。没有比这更准确的了。
  • 你说非便携式解决方案还可以。绑定到特定硬件(如特定 CPU 架构)的解决方案怎么样?
  • 是的。我愿意绑定到特定的硬件。我们使用英特尔至强。

标签: c++ linux-kernel clock chrono low-latency


【解决方案1】:

一种选择是通过__builtin_ia32_rdtsc 函数使用rdtsc 指令。在现代 Intel CPU rdtsc 在任何 CPU 频率下以基本时钟速率计时,因此您可以通过将计数器除以以 GHz 为单位的基本(非提升)CPU 频率将计数器转换为纳秒:

#include <regex>
#include <string>
#include <fstream>
#include <iostream>

double cpu_base_frequency() {
    std::regex re("model name\\s*:[^@]+@\\s*([0-9.]+)\\s*GHz");
    std::ifstream cpuinfo("/proc/cpuinfo");
    std::smatch m;
    for(std::string line; getline(cpuinfo, line);) {
        regex_match(line, m, re);
        if(m.size() == 2)
            return std::stod(m[1]);
    }
    return 1; // Couldn't determine the CPU base frequency. Just count TSC ticks.
}

double const CPU_GHZ_INV = 1 / cpu_base_frequency();

int main() {
    auto t0 = __builtin_ia32_rdtsc();
    auto t1 = __builtin_ia32_rdtsc();
    std::cout << (t1 - t0) * CPU_GHZ_INV << "nsec\n";
}

来自英特尔文档的更多信息:

恒定的 TSC 行为确保每个时钟滴答的持续时间是一致的,并支持将 TSC 用作挂钟计时器,即使处理器内核改变频率也是如此。这是向前发展的架构行为。

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

不变 TSC 基于不变计时硬件(称为 Always Running Timer 或 ART),以核心晶体时钟频率运行。

可扩展总线频率在位字段 MSR_PLATFORM_INFO[15:8] 中编码,标称 TSC 频率可以通过将此数字乘以 100 MHz 总线速度来确定。

【讨论】:

    【解决方案2】:

    boost::timer 有一些有趣的功能。我特别喜欢auto timer。它以微秒为单位显示时间。不知道它是否可以低于这个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多