我们正在尝试在硬件的设备驱动程序中包含一个基准。基准测试例程看起来像

for(int i = 0; i < lots; i++){
    tscStart = __rdtsc();
    WRITE_REGISTER_ULONG(ourRegister, ourValue)
    tscEnd = __rdtsc();

    duration = tscEnd - tscStart;
    // Store duration for later evaluation
}


现在,我们似乎对CPU重新排序调用有问题,因此在所有情况下,大约50%的duration都太短了(我们连接了示波器,因此可以确定)。

其他事实(我不知道这些是否相关,这是我们首次使用此类驱动程序):


__rdtscp具有相同的行为(在支持它的机器上)
我们尝试用_mm_mfence和/或__cpuid包围每行以强制命令序列化
使用dummy = READ_REGISTER_ULONG(ourRegister)的等效基准正在按预期工作。
我们的硬件通过PCIe连接


有没有办法让机器真正等待写入返回再花费第二次时间?

最佳答案

正如Hans Passant和Damon在评论中提到的那样,尝试使用__cpuid序列化__rdtsc调用应该可以,但是由于处理器不等待PCIe传输完成,因此我的计时数据无论如何都关闭了。

关于c - 在基准测试中强制__rdtsc()的串行执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20198091/

10-13 07:45