用户空间(Linux)中是否有高分辨率时钟(我们)?

Is there any high resolution clock (us) in User space (Linux)?

本文关键字:时钟 高分辨率 我们 空间 Linux 用户 是否      更新时间:2023-10-16

你知道Linux用户空间中高分辨率时钟(最小微秒)的任何C/C++实现(即使它不是便携式的)吗?

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

根据我对红帽 7.2 的研究:

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

谢谢。

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

#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 << "nsecn";
}

英特尔文档中的更多信息:

恒定的 TSC行为可确保每个时钟周期的持续时间是均匀的,并支持将 TSC 用作挂钟计时器,即使处理器内核更改频率也是如此。这是向前发展的体系结构行为。

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

不变TSC基于以核心晶体时钟频率运行的不变计时硬件(称为始终运行计时器或ART)。

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

boost::timer 有一些有趣的函数。 我特别喜欢自动计时器。 它以微秒为单位显示时间。 不确定它是否可以低于此。