c - 更好的基准同步

标签 c linux caching synchronization interrupt

我正在尝试对我添加到内核中的一些中断功能进行基准测试。目前,我只想测量一个中断从一个内核发送到另一个内核接收需要多长时间。我大致在做以下事情:

volatile bool wait = true;

...

//Sending core:
void run_benchmark() {
    //clear pipeline and record time A with rdtsc
    for (int i = 0; i < 10000; i++) {
        send_interrupt();
        while (wait);
        wait = true;
    }
    //record time B with rdtsc
    //benchmark = (B - A) / 10000
}

...

//Receiving core:
void handle_interrupt(...) {
    wait = false;
    ...
}

我还从基准测试中减去其他开销,例如记录时间的成本等。我发送中断 10,000 次以获得稳定的值。

我对这种方法的主要担心是接收核心和发送核心都会出现缓存未命中,因为它们各自将 wait 设置为不同的值。考虑到中断传送已经有多快,这些缓存未命中可能对我记录的基准测试产生重大影响。

有更好的方法吗?

最佳答案

在较新的 Intel 平台上,所有内核的 TSC 应该在 Linux 下同步。所以我认为你不需要这种同步 (see corresponding thread in the Intel developer zone).

为什么不简单地在接收 CPU 上获取 TSC 值?然后您可以在发送 CPU 上等待,直到时间 B 的变量包含一个合理的值。

关于c - 更好的基准同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48494539/

相关文章:

c++ - 用于创建多边形的 C/C++ PNG 库

c - 通过数组表示法访问枚举字符串?

linux - 使用 cp 复制多个文件

php - 大数据缓存

debugging - 如何为 Web 开发调试浏览器缓存

c++ - 混合 gtk+ 和 c++

linux - 如何通过终端在 VIM 的另一个窗口中打开文件?

linux - AWK - 如何列匹配文件 A 中的多个匹配项匹配文件 B 中的一个匹配项

xcode - 如何在 UITableView 中刷新时清除 NSURL 的缓存

c++ - 不使用预处理器调用 Clang