我实现了一个返回时间的快速函数(使用rdtsc),我们称它为fast_time()
。我有一个原始函数作为参考,它使用了一个系统调用,我们称它为system_time()
。我的程序使用fast_time()
,但在一个单独的线程中,我不断运行一个while循环来检查从我的函数和原始函数返回的时间之间的差异是否大于预定义的阈值。就像
while (true)
{
if (abs((fast_time() - system_time()).microseconds()) > MICROSECONDS_THRESHOLD)
{
report error
}
}
通常我不会看到错误,但有时我确实会看到错误,我想更好地理解这个问题。我的第一个怀疑是对system_time()
的调用不会在fast_time()
返回后立即发生。我怎么能强迫程序执行fast_time() - system_time()
"原子"尽可能?
rdtsc本身就是一种不可靠的实时度量方法,原因如下:
1)每个HW线程将返回不同的值,因此,如果你的线程没有锁定到一个HW线程,你会得到不同的值。因此,时间可能会出乎意料地来回跳跃,这取决于操作系统如何调度线程
更重要的是:
2) CPU节流会导致CPU的频率发生意外变化。因为rdtsc测量的是执行周期而不是时间,所以不能通过将周期数除以CPU频率(在两个rdtsc调用之间,频率可能随机变化)来可靠地获得经过的时间
同样,在您的特定测试用例中,操作系统可能会调度线程在fast_time()和system_time()调用之间产生,从而导致测量时间之间的差异,即使fast_time()将返回正确的值。所以回答你的问题,我认为没有任何方法可以防止这种情况发生