rdtsc乱序执行的解决方案?

2023-12-25

我正在尝试用 rdtsc 替换 clock_gettime(CLOCK_REALTIME, &ts) 来根据 CPU 周期而不是服务器时间来基准代码执行时间。基准测试代码的执行时间对于软件至关重要。我尝试在独立核心上的 x86_64 3.20GHz ubuntu 机器上运行代码并得到以下数字:

情况1:时钟获取时间:24纳秒

void gettime(Timespec &ts) {
        clock_gettime(CLOCK_REALTIME, &ts);
}

情况 2:rdtsc(没有 mfence 和编译器屏障): 10 ns

void rdtsc(uint64_t& tsc) {
        unsigned int lo,hi;
        __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
        tsc = ((uint64_t)hi << 32) | lo;
}

情况 3:rdtsc(带有 mfence 和编译器屏障): 30 ns

void rdtsc(uint64_t& tsc) {
        unsigned int lo,hi;
        __asm__ __volatile__ ("mfence;rdtsc" : "=a" (lo), "=d" (hi) :: "memory");
        tsc = ((uint64_t)hi << 32) | lo;
}

这里的问题是我知道 rdtsc 是非序列化调用,可以由 CPU 重新排序,另一种选择是 rdtscp,它是序列化调用,但 rdtscp 调用之后的指令可以在 rdtscp 调用之前重新排序。使用内存屏障会增加执行时间。

  • 对延迟敏感代码进行基准测试的最优化和最佳方法是什么?
  • 有没有办法优化我提到的案例?

你要lfence;rdtsc to start时钟,以及rdtscp;lfence停止时钟,因此障碍物位于计时间隔之外。

(或者有时你想要lfence;rdtsc;lfence启动时钟,以获得额外的可重复性,但代价是更多的开销。)

MFENCE 是错误的指令;它不能保证序列化指令流(但实际上它在具有最新微代码的 Skylake 上可以序列化,以修复错误)。 LFENCE 序列化指令流,无需等待存储缓冲区清空,只用于 ROB。这在英特尔上始终如此,但是一项且仅启用 Spectre 缓解功能 https://stackoverflow.com/questions/51844886/is-lfence-serializing-on-amd-processors这使得lfence不仅仅是一个NOP。 (我猜AMD不会重新排序movntdqa从 WC 内存加载,所以lfence作为那里的记忆屏障毫无意义,并且是only作为针对推测执行或 RDTSC 的执行屏障很有用。)

也可以看看如何从 C++ 获取 x86_64 中的 CPU 周期数? https://stackoverflow.com/questions/13772567/get-cpu-cycle-count/51907627#51907627其中有一个关于序列化的部分rdtsc。而且,您不需要为此使用内联汇编;使用__rdtsc() and _mm_lfence()。 (但与微基准测试一样,检查编译器的 asm 输出以确保它执行您想要的操作并不是一个坏主意。)


你无法避免开销,与几条指令的成本相比,它总是很大。

Also clflush 通过 C 函数使缓存行无效 https://stackoverflow.com/questions/51818655/clflush-to-invalidate-cache-line-via-c-function/51830976#51830976有关减去测量开销的示例。

但还要注意,通常将测试代码放入循环中更有用,因为结果准备好之前的执行延迟比等待指令实际从 ROB 中退出更有意义。看NASM 中的 RDTSCP 始终返回相同的值(对单个指令进行计时) https://stackoverflow.com/questions/54621381/rdtscp-in-nasm-always-returns-the-same-value/54624081#54624081例如(在 asm 中)测量单个 insn 的吞吐量/延迟。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rdtsc乱序执行的解决方案? 的相关文章

随机推荐

  • 将动态 JSON 值解析为 Java 对象

    在我的应用程序中 我有很多具有排序和过滤功能的概述 表格 由于不同的列可以保存不同的值类型 字符串 数字 日期 集合等 因此这些列的过滤器也可以带来不同的值 让我向您展示一些示例 已转换为 JSON 通过 REST 请求发送到服务器 对于简
  • XE7更新1和iOS 8.1模拟器不工作

    在 Delphi XE7 中将目标设置为 iOS 8 1 Simulator 时 应用程序崩溃 它部署得很好 也可以运行 但是 firemonkey 启动屏幕仍然打开并且永远不会完成加载 这种情况发生在一个普通的新移动应用程序中 只在表单中
  • SignalR:生成的代理与动态创建的集线器文件

    SignalR 集线器代理生成器的输出与动态生成的集线器代理文件本质上相同吗 如果不是 有什么区别 我的问题的一些背景 由于执行期间的依赖性问题 我正在努力使用命令行工具创建集线器代理 并且我确实认为获取动态生成的文件可能是一种更简单的方法
  • 限制 Visual Studio 的编辑区域仅显示一个函数或方法

    几年前 当我使用 VB 6 时 我可以让编辑器窗口只显示我正在处理的函数 方法 我怀念这一点 有没有一种方法 一个插件 或者一个黑客 可以让我现在做同样的事情 Thanks 看来此功能已被删除 而且没有办法解决这个问题 也许您可 以考虑为
  • ValueError:无法解析相关模型u'mutech.branch'

    我正在尝试在 models py 文件中创建外键 但是在运行 python manage py migrate 命令时 我收到以下错误 之前一切都很好 即使我撤消了所有更改 它仍然给出相同的错误 我也尝试删除我的数据库 但没有任何效果 Ap
  • SKPhysicsBody 不符合预期

    我有以下代码来创建一个矩形砖块和一个与其关联的物理体 我预计物理主体是一个与砖块相同大小和位置的实心矩形 但我得到的主体有一个位置偏移 也许还有尺寸差异 我错过的坐标系是否存在问题 解决这个问题的正确方法是什么 void addBrick
  • 跨多个区域部署 Firebase Cloud Functions

    我想跨多个区域部署相同的云功能 有简单的方法吗 由于您没有说明要部署什么类型的函数 因此我假设 https 函数 将任何其他类型的 后台 功能部署到多个区域是没有意义的 因为每个区域都可能触发每个事件 这将相当混乱 使用 https 函数
  • 当提供正则表达式时,Java 中的 String.split() 方法到底如何工作?

    我正在准备 OCPJP 考试 遇到以下示例 class Test public static void main String args String test I am preparing for OCPJP String tokens
  • UITableView 中替代单元格的不同高度

    如何制作具有不同高度的备用单元 我需要 cell1 的高度为 60 cell2 的高度为 30 我怎样才能做到这一点 提前致谢 您可以通过表视图的委托方法设置单元格的高度 CGFloat tableView UITableView tabl
  • 如何为 JSON 对象设置原型?

    我正在从服务器接收一些 JSON 对象 并且我想将其 类型转换 或 祝福 为具有已定义方法的对象 有没有办法为普通 JSON 对象设置原型 function MyClass someValue this myProperty someVal
  • Firefox 3 窗口焦点和模糊

    窗口 blur 函数 窗口焦点 假 焦点 函数 窗口焦点 真 问题是 在 Firefox 3 中 当我创建新选项卡时 它不会丢失窗口焦点 而在ff2 ie7中确实输了 在 ff3 中 当我选择另一个程序时 它只会失去窗口焦点 有人有解决这个
  • 为什么 reshape2 融化对我来说返回值 = NA?

    为什么重塑2melt return value NA for me 它对我来说适用于 reshape 但不适用于 reshape2 这是一个示例数据文件 station id year month day h1 h2 h3 h4 h5 h6
  • 无法使用 CDK + Lambda 捆绑资产错误

    我有这个项目结构 其中control是我的项目的名称和根 control src control loader gt this has a function inside called also control loader utils s
  • 使用日期时间时 matplotlib“axis.invert_xaxis”崩溃

    如果我运行以下代码 import pandas as pd from datetime import datetime import numpy as np import matplotlib pyplot as plt df pd Dat
  • 如何按时间段对DataFrame进行分组?

    我有来自日志文件的一些数据 并希望按分钟对条目进行分组 def gen date count 10 while count gt 0 yield date event format randint 1 9 source format ran
  • PHP从列表中随机选择

    我目前正在使用随机选择颜色的 PHP 代码 div style background none class post bg thickbox div
  • 在 clojure core.async go-loop 中工作的方式有哪些权衡?

    当我编写更多 core async 代码时 出现的一种非常常见的模式是循环 它在一系列通道上进行切换并执行一些工作来响应消息 例如 go loop state let value task alts tasks work recur sta
  • `alias sudo="sudo "` 是如何工作的?

    研究将当前用户的别名传递给sudo命令 我发现以下内容在 ArchWiki 上 https wiki archlinux org index php Sudo Passing aliases 传递别名 如果您使用很多别名 您可能会注意到它们
  • AS3 按住按钮时连续运行代码 - Air 适用于 iOS/Android

    我正在 Flash CS6 中开发 iOS 游戏 我有一个基本的运动测试Event MOUSE DOWN处理程序 我期望 想要的是 当我将手指按住按钮时 玩家会继续移动 直到我停止触摸屏幕 但发生的情况是 我必须不断地点击才能让玩家保持移动
  • rdtsc乱序执行的解决方案?

    我正在尝试用 rdtsc 替换 clock gettime CLOCK REALTIME ts 来根据 CPU 周期而不是服务器时间来基准代码执行时间 基准测试代码的执行时间对于软件至关重要 我尝试在独立核心上的 x86 64 3 20GH