我实现了一个返回时间的快速函数(使用rdtsc),我们称之为fast_time()
。我有参考使用系统调用的原始函数,我们称之为system_time()
。我的程序使用fast_time()
,但在一个单独的线程中,我一直在运行一个while循环来检查从my函数返回的时间与原始函数之间的差异是否大于预定义的阈值。像
while (true)
{
if (abs((fast_time() - system_time()).microseconds()) > MICROSECONDS_THRESHOLD)
{
report error
}
}
通常我看不到错误,但有时我会得到它们,我想更好地理解这个问题。我首先怀疑在system_time()
返回后不会立即调用fast_time()
。如何强制程序尽可能“原子地”执行fast_time() - system_time()
?
答案 0 :(得分:2)
1)每个HW线程将返回不同的值,因此如果您的线程没有锁定到一个HW线程,您将获得不同的值。因此,时间可能会意外地来回跳转,具体取决于操作系统如何安排线程
更重要的是:
2)CPU限制会导致CPU的频率意外改变。因为rdtsc测量执行的周期而不是时间,你可以通过将周期数除以CPU频率来可靠地获得经过的时间(在两个rdtsc调用之间,频率可能随机变化)
同样在您的特定测试用例中,OS可以调度线程在fast_time()和system_time()调用之间产生,从而导致测量时间之间的差异,即使fast_time()将返回正确的值。所以为了回答你的问题,我不认为有任何办法可以阻止这一点。