gpt4 book ai didi

c++ - 使用 C++ 在多线程应用程序中测量全局时间(挂钟)的最快方法

转载 作者:行者123 更新时间:2023-11-30 03:17:55 28 4
gpt4 key购买 nike

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

现在,我正在使用带有时间戳的 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*/);

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

  • chrono 需要大约 34096 个刻度
  • rdtsc 需要大约 1744 个刻度

问题:

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

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

最佳答案

I can't use rdtsc because it is as far as I know relative only.

它是相对于某个未指定的时间点,例如CPU 开机时间。

I can't use it to measure time-points, right?

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


如果你使用gcc__builtin_ia32_rdtsc generates better assembly than hand-coded versions .

关于c++ - 使用 C++ 在多线程应用程序中测量全局时间(挂钟)的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55103471/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com