Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C+;在多线程应用程序中测量全局时间(挂钟)的最快方法+;_C++_Multithreading_Time_Chrono - Fatal编程技术网

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

C++ 使用C+;在多线程应用程序中测量全局时间(挂钟)的最快方法+;,c++,multithreading,time,chrono,C++,Multithreading,Time,Chrono,我正在开发一个高性能库,在这个库中,我需要在线程完成计算时停止线程的时间点,然后将该时间点保存在一个全局变量中,以便该全局变量始终保存线程最近的完成时间 现在,我使用C++ STD:TimeO库,用时间戳来停止时间: auto start = std::chrono::high_resolution_clock::now().time_since_epoch(); // thread calculates something auto finish = std::chrono::high_res

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

现在,我使用C++ STD:TimeO库,用时间戳来停止时间:

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.
auto start=std::chrono::high_resolution_clock::now().time_since_epoch();
//线程计算一些东西
自动完成=std::chrono::高分辨率时钟::now().自纪元起的时间();
unsigned time=std::chrono::duration_cast(finish start).count();
//现在我可以使用所需的时间,还可以用完成时间点更新一个全局变量。
这很有效。但是…

对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*/);
static\uuuuuuuuuuuuuuuuuuu内联\uuuuuuuuuuu ticks(void)
{
未签名的a,d;
asm(“cpuid”);
asm挥发性(“rdtsc”:“=a”(a),“=d”(d));
返回((滴答声)a)|((滴答声)d)
我不能使用rdtsc,因为据我所知,它只是相对的

它与某些未指定的时间点有关,例如CPU开机时间

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

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



如果您使用
gcc
,.

这听起来像是XY问题。为什么需要全局时间点?通常不应该使用计时信息来同步多线程代码。
rdtsc
高分辨率时钟
都不能测量“挂钟”时间。它们只是周期计数器。那么您是在寻找挂钟时间还是周期计数器?您可以将程序/线程开始时的滴答计数存储在全局变量中,并将其用作时间点的引用。(如果
rdtsc
是线程本地的,则该变量必须是线程本地的)@NathanOliver我需要全局时间,这样每个线程都知道“自从最后一个线程完成了多少时间单位[例如微秒]”。Nicolas Bolas是的,但我使用chrono中的“TimesIncepoch”来获得全局时间。这就是它工作的原因,但我只是想知道是否有更快的方法:)也许我的方法不是最佳解决方案。@MAxLanghof感谢您提供的信息,但这是否仍然正确?我真的不知道rdtsc是如何深入工作的,但它是否计算了所有运行线程的所有周期?因为,例如,如果同时运行10个线程,所花费的时间将是实际时间的10倍。比答案是ks!好的,那么我如何才能找出那个未设定时间的挂钟时间?例如,要知道最后一个线程完成了一个计算的时间是多少微秒?您可以调用
std::chrono::high_resolution_clock::now()
两次调用
rdtsc
之间。取两个
rdtsc
值的平均值-此
rdtsc
值对应于
std::chrono::high_resolution_clock::now()返回的挂钟
。这个数字到底是多少?我刚刚测试了rdtsc以测量具有100万次迭代的串行循环的持续时间,并测量了具有3个线程和300万次迭代的并行化循环。结果大致相同(+并行化循环上的一些线程开销)。因此,此函数不计算所有线程的总周期数,而是计算全局数?@XHotSniperX它是CPU周期数,是一个全局计数器。要将其转换为纳秒,请将其除以标称CPU频率。例如,对于4.2GHz基频7700k,请将其除以4.2。处理器单调递增时间戳每个时钟周期计数器MSR,并在处理器复位时将其重置为0。有关时间戳计数器行为的具体详细信息,请参阅《英特尔64和IA-32体系结构软件开发人员手册》第3B卷第17章中的“时间戳计数器”。