基准测试 - 如何计算发送到 CPU 的指令数以查找消耗的 MIPS

2024-01-07

假设我有一个软件并想使用黑盒子 https://en.wikipedia.org/wiki/Black-box_testing方法。我有一个 3.0GHz CPU,有 2 个插槽和 4 个核心。如您所知,为了找出每秒指令数 (IPS),我们必须使用以下公式:

IPS = sockets*(cores/sockets)*clock*(instructions/cycle)

首先,我想找到我的特定算法每个周期的指令数。然后我意识到使用块盒方法几乎不可能计算它,我需要对算法进行深入分析。

但现在,我有两个问题:无论我的机器上运行什么类型的软件及其CPU使用情况,有没有办法计算每秒发送到CPU的指令数(每秒百万条指令(MIPS))?是否可以找到指令集的类型(添加、比较、输入、跳转等)?

任何脚本或工具推荐都将受到赞赏(任何语言)。


perf stat --all-user ./my_programLinux上的CPU会使用CPU性能计数器来记录它运行了多少个用户空间指令,以及它花费了多少个核心时钟周期。它使用了多少 CPU 时间,并将为您计算每个核心时钟周期的平均指令,例如

3,496,129,612      instructions:u            #    2.61  insn per cycle

它为你计算IPC;这通常比每个说明更有趣second. uops不过,就您距离最大化前端的程度而言,每个时钟通常更有趣。您可以手动计算 MIPSinstructions and task-clock.对于大多数其他事件,perf 以每秒的速率打印一条评论。

(如果你不使用--all-user, 您可以使用perf stat -e task-clock:u,instructions:u,...让这些特定事件仅在用户空间中计数,而其他事件可以始终计数,包括内部中断处理程序和系统调用。)

But see 如何使用 perf stat 计算 MIPS https://stackoverflow.com/questions/53363242/how-to-calculate-mips-using-perf-stat欲了解更多详细信息instructions / task-clock vs. instructions / elapsed_time如果您确实想要跨核心的总或平均 MIPS,以及是否计算睡眠。


有关在静态可执行文件中的小型微基准循环上使用它的示例输出,请参阅x86的MOV真的可以“免费”吗?为什么我根本无法重现这个? https://stackoverflow.com/questions/44169342/can-x86s-mov-really-be-free-why-cant-i-reproduce-this-at-all

如何在运行时获取实时信息

您的意思是从程序内部仅分析其中的一部分吗?有一个 perf API 你可以做perf_event_open或者其他的东西。或者使用不同的库直接访问硬件性能计数器。

perf stat非常适合对已隔离到仅运行热循环一秒钟左右的独立程序中的循环进行微基准测试。

或者也许你的意思是别的。perf stat -I 1000 ... ./a.out将每 1000 毫秒(1 秒)打印一次计数器值,以查看程序行为如何实时变化无论您想要什么时间窗口(低至 10 毫秒间隔)。

sudo perf top是系统范围的,有点像 Unixtop

还有perf record --timestamp记录每个事件样本的时间戳。perf report -D可能与此一起有用。看http://www.brendangregg.com/perf.html http://www.brendangregg.com/perf.html,他提到了一些关于-T (--timestamp)。我还没有真正使用过这个;我主要隔离单个循环,我正在调整为可以在其下运行的静态可执行文件perf stat.


是否有可能找到指令集的类型(添加、比较、输入、跳转等)?

Intel x86 CPU 至少有一个用于分支指令的计数器,但除了 FP 指令之外,其他类型没有区别。这对于大多数具有性能计数器的架构来说可能很常见。

对于 Intel CPU,有ocperf.py https://github.com/andikleen/pmu-tools,一个包装器perf具有更多微建筑事件的象征性名称。 (更新:普通perf现在知道大多数 uarch 特定计数器的名称,因此您不需要ocperf.py不再了。)

perf stat -e task_clock,cycles,instructions,fp_arith_inst_retired.128b_packed_single,fp_arith_inst_retired.scalar_double,uops_executed.x87 ./my_program

它并不是为了告诉您正在运行哪些指令,您已经可以通过跟踪执行来判断。大多数指令都是完全流水线化的,因此有趣的是哪些端口的压力最大。除法/平方单位是个例外:有一个计数器arith.divider_active: "除法单元忙于执行除法或平方根运算时的循环。考虑整数和浮点运算“。分配器没有完全流水线化,所以一个新的divps or sqrtps即使没有旧的微指令准备在端口 0 上执行,也无法始终启动。(http://agner.org/optimize/ http://agner.org/optimize/)

有关的:linux perf:如何解释和查找热点 https://stackoverflow.com/questions/7031210/linux-perf-how-to-interpret-and-find-hotspots用于使用perf来识别热点。特别是使用自上而下的分析perf对调用堆栈进行采样以查看哪些函数进行了大量昂贵的子调用。 (我提到这一点是为了以防万一你就是这样really我想知道,而不是混合指令。)

Related:

  • 如何确定 C 程序中执行的 x86 机器指令数? https://stackoverflow.com/questions/54355631/how-do-i-determine-the-number-of-x86-machine-instructions-executed-in-a-c-progra
  • 如何通过获取指令类型细分来表征工作负载? https://stackoverflow.com/questions/58243626/how-to-characterize-a-workload-by-obtaining-the-instruction-type-breakdown
  • 如何监控 SIMD 指令的使用量 https://stackoverflow.com/questions/60104698/how-do-i-monitor-the-amount-of-simd-instruction-usage

为了获得精确的动态指令计数,如果您使用的是 x86,您可以使用 Intel PIN 等检测工具. https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool.

perf stat计为instructions:u硬件甚至也应该或多或少地精确,并且实际上在执行相同工作的同一程序的运行中非常可重复。

在最新的 Intel CPU 上,硬件支持记录条件/间接分支的走向,因此您可以准确地重建哪些指令按顺序运行,假设没有自修改代码并且您仍然可以读取任何 JIT 缓冲区。Intel PT https://software.intel.com/en-us/blogs/2013/09/18/processor-tracing.


抱歉,我不知道 AMD CPU 上的等效项是什么。

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

基准测试 - 如何计算发送到 CPU 的指令数以查找消耗的 MIPS 的相关文章

随机推荐

  • ddply 中抛出的错误导致 R 崩溃

    我遇到了一个问题 当提供的函数抛出错误时 plyr 始终崩溃 gt require plyr Loading required package plyr Warning message package plyr was built unde
  • 为新项目选择“更好”或更熟悉的技术?

    我希望开始一个全新的项目 作为我的第一个独立可销售项目 我已经考虑了一段时间了 从广义上讲 它是一个基于 Web 的服务应用程序 而我的第一选择 服务器语言非常简单 我过去在 Java Web 应用程序上工作 对 Java 非常了解 然而
  • 使用 Jquery $.get() 逐行检索文本文件

    是否可以逐行检索txt文件内容 现在我正在使用这段代码 var file http plapla com pla txt function getFile get file function txt save txt responseTex
  • geom_wordcloud :这是一个白日梦吗

    我处理一些跨各种分组变量的文本数据 我正在考虑创建一种使用 Ian Fellows 制作多面文字云图的方法wordcloud包裹 我喜欢这种方式ggplot2方面的社会变量 我正在决定如何解决这个问题 多面词云图 是否可以使用 Fellow
  • 为什么使用隐藏字段?

    我经常看到 Web 应用程序中使用了很多隐藏字段 我所编写的代码是为了使用大量隐藏字段以及来回发送给它们的可见字段的数据值而编写的 虽然我不明白为什么使用隐藏字段 我几乎总能想出在不使用隐藏字段的情况下解决相同问题的方法 隐藏字段如何帮助设
  • Java 进程挂在 IOUtils 上。疑似死锁

    我有一个 java 进程挂在调用中IOUtils toString使用以下代码 String html try html IOUtils toString someUrl openStream utf 8 process hangs on
  • Vue.js 动态类名?

    我需要根据评论等级进行颜色降级 我希望在 Vue js 中完成一些事情 如下所示 div class review 在我的方法中我有这样的东西 reviewColor return green 不幸的是 这并没有为我提供 green 班级
  • 将解决方案中的所有项目重新定位到 .NET 4.5.2

    我在 Visual Studio 2012 中有一个解决方案 其中包含 170 个 C 项目 我需要将所有项目从 NET Framework 4 0 重新定位到 4 5 2 我更喜欢让 Visual Studio 通过进入每个项目的属性 更
  • 将 JSON 日期转换为 MM/DD/YYYY 格式?

    我的客户收到一个包含多列的电子表格 其中一列是 日期 只有日期被格式化为Date 1292291582263 0700 看起来是一个 JSON 日期 我需要在此电子表格代码 VBA 的其他位置转换并使用 MM DD YYYY 格式的 JSO
  • Bootstrap 3 - 带侧边栏的 Scrollspy

    我正在使用 Bootstrap 3 我想重新创建与侧边栏相同的功能Bootstrap 站点上的文档 http getbootstrap com javascript 下面是我的代码 它也在这里 http bootply com 82119
  • 使用带有信任证书的 ClickOnce 进行 WPF 应用程序部署

    我已使用测试证书将 WPF 应用程序部署到生产环境 现在 我必须更改测试证书并购买新证书 我浏览了 MSDN 网站 但无法得出结论该怎么办 所以 我需要澄清以下内容 在哪里购买这些证书文件以及它是什么类型的证书 我们必须在客户端系统上安装这
  • MSBuild 无法使用临时密钥签署 ClickOnce 清单(错误 MSB3326 和 MSB3321)

    我正在尝试构建 ClickOnceWindows 窗体 http en wikipedia org wiki Windows FormsWindows Server 计算机上的项目 NET 3 5 Visual Studio 2010 为了
  • create_proc_entry() 的替代方法是什么

    As create proc entry函数已被弃用 它的替代品是什么 我试图使用创建一个简单的过程条目create proc entry但得到了这个错误 错误 函数 create proc entry 的隐式声明 我摸索着create p
  • 如何创建支持空值的结构?

    我是 C 新手 在 C 中 我无法将结构的值设置为 null 如何创建支持 null 值的结构 通过使用 Generic Nullable 类来包装结构和值类型 可以使其可为空 例如 Nullable
  • 如何将字符串转换为字母数字并将空格转换为破折号? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想获取一个字符串 去掉所有非字母数字字符并将所有空格转换为破折号 每当我想将标题或其他字符串转换为 URL slug
  • Javascript - 带蓝牙键盘的 iPad Tab 键检测

    我有一个文本字段 用户可以在其中输入数据 他们可以使用 Tab 键 然后字段会缩进 除了带有蓝牙键盘的 ios 之外 这对所有设备都适用 如果我访问http www rapidtables com tools notepad htm htt
  • nmake:构建 OpenSSL 时未找到命令

    我正在尝试使用 git bash 上的此说明来遵循 Windows 上 OpenSSL 的安装说明 在 Windows 上 仅选择一个目标进行配置 perl Configure VC WIN32 VC WIN64A VC WIN64I VC
  • 怎样才能让Jasmine等待一个promise被解决或者被拒绝呢?

    我有一个特定的函数 我正在尝试使用 Angular 来测试它 该函数返回一个承诺 尽管在我的测试中我对 Promise 结果设定了期望 但 Jasmine 不会等待 Promise 得到解决或拒绝 警告 错误 规格 test 没有任何期望
  • 如何让JavaFX Chart NumberAxis只显示Integer值,而不是double值

    我正在尝试创建一个图表 其轴旨在显示员工人数 因此它必须仅显示整数 但我发现这并不像我已经尝试过的那么容易yAxis setTickUnit 1 但当值很小时它就不起作用 等等 最大值是3 它仍然会显示0 5 1 5 我只想要刻度值 如1
  • 基准测试 - 如何计算发送到 CPU 的指令数以查找消耗的 MIPS

    假设我有一个软件并想使用黑盒子 https en wikipedia org wiki Black box testing方法 我有一个 3 0GHz CPU 有 2 个插槽和 4 个核心 如您所知 为了找出每秒指令数 IPS 我们必须使用