c - 在基准测试中强制串行执行 __rdtsc()

标签 c windows driver

我们正在尝试在我们的硬件的设备驱动程序中包含一个基准。基准测试例程如下所示

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% 的情况下,持续时间 太短(我们连接了示波器,所以我们当然在这里)。

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

  • __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/

相关文章:

c - 使用不带字符串化的#define 参数名称

将字符串文字与字 rune 字连接起来

c - 如何从不是字节对齐的源复制内存(移位)

C: listen() API 返回 -1

windows - 通过 pnputil 安装驱动程序

macos - 为 OS X 创建虚拟监视器驱动程序的指针

c - 为什么内核中出现段错误?

windows - UNIX shell 脚本在 Windows 中的等效项是什么?

java - Proguard:无法读取 C:\Program Files\Java\jdk-15.0.1\lib\rt.jar (没有这样的文件或目录)

Linux设备驱动程序: stream data into a single register