使用clock_gettime(CLOCK_MONOTONIC)在CPU上移动线程

时间:2014-06-14 21:26:12

标签: linux windows multithreading winapi posix

我听说有人抱怨当操作系统决定将调用线程移动到新的物理CPU时,WinAPI函数QueryPerformanceFrequency()和QueryPerforamnceCounter()可能会出现异常且不稳定的行为。

有人知道clock_gettime(CLOCK_MONOTONIC)是否有类似的问题吗?还是更保证稳定?

此外,关于WinAPI上的QPF / QPC的担忧是否已成为过去?或者即使在今天他们仍然担心?

1 个答案:

答案 0 :(得分:0)

OP:

  

我听说有人抱怨当操作系统决定将调用线程移动到新的物理CPU时,WinAPI函数QueryPerformanceFrequency()和QueryPerforamnceCounter()可能会出现异常且不稳定的行为。

我不确定你的意思是什么?"不稳定"或者"不稳定。"如果您的意思是内核之间的差异或差异,这些问题可能基于12 - 15年前发布的计算机(基于XP和Win2000的操作系统)。来自微软:

  

QPC适用于Windows XP和Windows 2000,适用于大多数系统。但是,一些硬件系统' BIOS没有正确地指示硬件CPU特性(非永久性TSC),并且一些多核或多处理器系统使用具有TSC的处理器,这些处理器不能跨核同步。如果使用TSC作为QPC的基础,运行这些版本的Windows的固件有缺陷的系统可能无法在不同的内核上提供相同的QPC读数。   

对于大多数当前的硬件而言,这几乎已成为一个问题(参见下面的链接)。

OP:

  

有人知道clock_gettime(CLOCK_MONOTONIC)是否有类似的问题吗?还是更保证稳定?

嗯,任何高频时钟必须来自某处。在Windows框中(因为您询问了QPC),该值将来自何处?在任何对QueryPerformanceCounter的调用中添加一个额外的层基本上保证精度较低,因为在" 现在"之间的混合中会有更多的CPU指令。和#34; 现在由操作系统向您报告" (并且,尽管极不可能,抢占的可能性会略有增加,从而进一步导致精度下降)。

这同样适用于任何基于Intel的Linux / BSD /任何盒子,因为它们必须以相同的硬件特性运行。在英特尔架构领域,您能够获得的最高频率将是基于RDTSC和操作系统的最大努力,以保持任何TSC值尽可能接近核心或处理器(至少在没有专门硬件的情况下)。

这就是为什么任何基准测试应该是基于大量数据点的平均性能预期。

Microsoft实际上有一份非常好的文档,概述了高频定时器的实现特性,包括HPET和ACPI电源管理时间,并简要介绍了多时钟和虚拟化:http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx

OP:

  

此外,关于WinAPI上的QPF / QPC的担忧是否已成为过去?或者即使在今天他们仍然担心?

对于世界上大多数人来说,是的。我研究基于服务器的代码,其中微秒计数(高频率市场数据),但是大多数认为几百微秒将要成功或破坏他们的程序的人都在开玩笑。你知道如何 long 服务网页吗?即使有数千名用户,CPU本身也会厌倦所有等待。