C++ 在用户空间(Linux)中是否有高分辨率时钟(us)?

C++ 在用户空间(Linux)中是否有高分辨率时钟(us)?,c++,linux-kernel,clock,chrono,low-latency,C++,Linux Kernel,Clock,Chrono,Low Latency,您是否知道Linux在用户空间中有任何高分辨率时钟(最低微秒)的C/C++实现(即使它不是可移植的) 目标是测量一些低延迟操作的时间间隔。 我测量到内核空间时钟会在一定程度上导致延迟峰值 根据我对Red Hat 7.2的研究: std::chrono::高分辨率时钟最大分辨率为毫秒 通过内核系统调用实现时钟的单调性和实时性 通过内核系统调用执行gettimeofday clock_gettime clock_单调_粗糙度和clock_REALTIME_粗糙度在用户空间中执行,但最大分辨率为毫秒

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

目标是测量一些低延迟操作的时间间隔。 我测量到内核空间时钟会在一定程度上导致延迟峰值

根据我对Red Hat 7.2的研究:

  • std::chrono::高分辨率时钟最大分辨率为毫秒
  • 通过内核系统调用实现时钟的单调性和实时性
  • 通过内核系统调用执行gettimeofday
  • clock_gettime clock_单调_粗糙度和clock_REALTIME_粗糙度在用户空间中执行,但最大分辨率为毫秒

谢谢。

一个选项是通过
\uuuu内置的ia32\urdtsc
功能使用
rdtsc
指令。在现代英特尔CPU上,任何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";
}
#包括
#包括
#包括
#包括
双cpu_基频(){
std::regex re(“模型名\\s*:[^@]+@\\s*([0-9.]+)\\s*GHz”);
std::ifstream cpuinfo(“/proc/cpuinfo”);
std::smatch m;
for(std::string line;getline(cpuinfo,line);){
正则表达式匹配(行、m、re);
如果(m.size()==2)
返回std::stod(m[1]);
}
return 1;//无法确定CPU基本频率。只需计算TSC信号。
}
双常数CPU_GHZ_INV=1/CPU_基频();
int main(){
自动t0=uu内置_uia32_rdtsc();
自动t1=uuu内置ia32_rdtsc();

std::cout一个选项是通过
内置ia32\u rdtsc
函数使用
rdtsc
指令。在现代Intel CPU上,在任何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";
}
#包括
#包括
#包括
#包括
双cpu_基频(){
std::regex re(“模型名\\s*:[^@]+@\\s*([0-9.]+)\\s*GHz”);
std::ifstream cpuinfo(“/proc/cpuinfo”);
std::smatch m;
for(std::string line;getline(cpuinfo,line);){
正则表达式匹配(行、m、re);
如果(m.size()==2)
返回std::stod(m[1]);
}
return 1;//无法确定CPU基本频率。只需计算TSC信号。
}
双常数CPU_GHZ_INV=1/CPU_基频();
int main(){
自动t0=uu内置_uia32_rdtsc();
自动t1=uuu内置ia32_rdtsc();

std::cout有一些有趣的函数。我特别喜欢。它以微秒为单位显示计时。不确定它是否可以低于此值。

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

目标是测量间隔时间我测量到内核空间时钟会导致一些时间延迟峰值。要做到这一点的诀窍是做很多调用。如果你做了10亿次调用,即使获得时间的成本是1秒,也要比10亿次调用多1秒,因此每次调用的平均值为1纳秒。你无法获得更准确的结果你说不可移植的解决方案没问题。绑定到特定硬件的解决方案怎么样,比如特定的CPU体系结构?是的。我是开放绑定到特定硬件的。我们使用Intel Xeon。目标是测量一些低延迟操作的时间间隔。我测量了内核空间时钟导致的一些时间延迟派克斯。这样做的诀窍是打很多电话。如果你打10亿个电话,即使获得时间的成本是1秒,也要比10亿个电话多1秒,因此平均每次通话时间为1纳秒。你说的准确度再高不过了。你说不可移植的解决方案没问题。绑定到特定硬件的解决方案怎么样像一个特定的CPU架构吗?是的。我被打开绑定到一个特定的硬件。我们使用Intel Xeon。