首页 > 解决方案 > 使用 C++ 在多线程应用程序中测量全局时间(挂钟)的最快方法

问题描述

我正在开发一个高性能库,我需要在完成计算时停止线程的时间点,然后将该时间点保存在全局变量中,以便该全局变量始终保存最近的完成时间线。

现在,我正在使用带有时间戳的 C++ std:chrono 库来停止时间,例如:

auto start = std::chrono::high_resolution_clock::now().time_since_epoch();
// thread calculates something
auto finish = std::chrono::high_resolution_clock::now().time_since_epoch();
unsigned time = std::chrono::duration_cast<std::chrono::microseconds>(finish-start).count();
// now I can use the needed time and also update a global variable with the finish time point.

这工作得很好。但...

对 chrono 的调用比对 rdtsc() 的调用慢。

rdtsc 版本:

static __inline__ ticks getticks(void)
{
     unsigned a, d;
     asm("cpuid");
     asm volatile("rdtsc" : "=a" (a), "=d" (d));

     return (((ticks)a) | (((ticks)d) << 32));
}

tick = getticks();
sleep(1); // or whatever calculation
tick1 = getticks();
time = (unsigned)((tick1-tick)/2400000/*The CPU speed*/);

比较: 我用 rdtsc 本身测量了 chrono 和 rdtsc 调用,以查看它们需要多少滴答声,结果是:

问题:

我不能使用 rdtsc 因为据我所知,它只是相对的。我不能用它来测量时间点,对吧?我不仅想要一些计算的持续时间,还想要实际的完成时间点,以便每个线程都知道最近的完成时间发生的时间。

问题:测量全局时间点并在所有线程之间共享的最快方法是什么?

标签: c++multithreadingtimechrono

解决方案


我不能使用 rdtsc ,因为据我所知,它只是相对的。

它与某个未指定的时间点相关,例如 CPU 开机时间。

我不能用它来测量时间点,对吧?

您用于rdtsc测量CPU 周期的持续时间。您还可以将该值用作自未指定时间以来的时间点。您还可以找出该未指定时间的挂钟时间。


如果您使用gcc__builtin_ia32_rdtsc生成比手动编码版本更好的程序集


推荐阅读