Linux perf 中的运行时间和报告的周期计数

2024-03-11

我在 4 核 Intel CPU(每个核心 1 个线程)上运行了单线程矩阵乘法,但 perf 中的数字没有意义。

 Performance counter stats for 'system wide':

    31,728,397,287      cpu-cycles                #    0.462 GHz                    
   131,661,730,104      ref-cycles                # 1916.425 M/sec                  
         68,701.58 msec cpu-clock                 #    4.000 CPUs utilized          
         68,701.90 msec task-clock                #    4.000 CPUs utilized          
    31,728,553,882      cpu/cpu-cycles/           #  461.830 M/sec                  

      17.176244725 seconds time elapsed

我已将 cpu 频率设置为最低并观察,所有核心都以 800MHz 运行。这意味着 1 个周期为 1.25ns。总 CPU 周期为 31,728,397,287,执行时间应为 39.66 秒,但运行时间为 17.1 秒。

我也不知道为什么 0.462 GHz 写在 cpu-cycles 前面。

有关处理器的更多信息:

Thread(s) per core:              1
Core(s) per socket:              4
Socket(s):                       1
NUMA node(s):                    1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           94
Model name:                      Intel(R) Core(TM) i5-6600 CPU @ 3.30GHz
Stepping:                        3
CPU MHz:                         800.022
CPU max MHz:                     3900,0000
CPU min MHz:                     800,0000

对此有什么想法吗?

UPDATE:

我使用 root 访问权限重新运行实验并指定用户代码。

# perf stat -a -e cycles:u,cycles,cpu-clock  ./mm_double_omp 1
Using 1 threads
Total execution Time in seconds: 15.4839418610
MM execution Time in seconds: 15.3758427450

 Performance counter stats for 'system wide':

    14,237,521,876      cycles:u                  #    0.230 GHz                    
    17,470,220,108      cycles                    #    0.282 GHz                    
         61,974.41 msec cpu-clock                 #    4.000 CPUs utilized          

      15.494002570 seconds time elapsed

正如你所看到的,频率仍然不是800MHz。但是,如果我不指定-a结果是有意义的,因为 Cycles:u * (1/800MHz) 几乎与经过的时间相同。

# perf stat -e cycles:u,cycles,cpu-clock  ./mm_double_omp 1
Using 1 threads
Total execution Time in seconds: 16.5347361100
MM execution Time in seconds: 16.4267430900
 Performance counter stats for './mm_double_omp 1':

    13.135.516.694      cycles:u                  #    0,794 GHz                    
    13.201.778.987      cycles                    #    0,798 GHz                    
         16.541,22 msec cpu-clock                 #    1,000 CPUs utilized          

      16,544487905 seconds time elapsed

      16,522146000 seconds user
       0,019997000 seconds sys

我已经运行了单线程矩阵乘法

但后来你数了一下全系统运行时跨所有 4 个核心。就是这样perf -a是的,以及为什么你得到了Performance counter stats for 'system wide':在你的输出中。

所以内核的task-clock只要进程处于活动状态,“事件”就会计算所有 4 个核心的时间:

68,701.90 毫秒任务时钟#使用 4.000 个 CPU

那是 68.7 CPU 秒,几乎正好是 4x 17.17 秒,这是有道理的。


我也不知道为什么 0.462 GHz 写在 cpu-cycles 前面。

这是代码处于活动状态期间所有 4 个核心的平均周期/时间。对于处于睡眠状态的 CPU,时钟不会滴答作响,因此平均负载似乎是4 * 462/800 = 2.31当您的代码保持 1 个核心忙碌时,CPU 未处于睡眠状态。

因此,您在系统平均运行另外 1.3 个线程时进行基准测试。 (包括中断唤醒的CPU时间)

我假设您的测量不仅限于用户空间(不包括在内核模式下花费的滴答声);这是另一种可能的影响。


如果你没有使用过-a,如果仅计算用户空间周期,而不计算内核中花费的周期,仍然可能会出现低于硬件运行频率的情况。 (例如。perf stat --all-user,或者与你的kernel.perf_event_paranoid设置得足够高,以免您分析有效应用的内核中的硬件事件:u到硬件事件,但不将它们打印为cycles:u.)

如果你改变你的kernel.perf_event_paranoidsysctl 设置为 0,或运行perf作为 root,您应该看到 800 MHz 作为周期/任务时钟,因为这是线程运行时 CPU 运行的速度。

在用户空间之外花费大量周期表明您的代码在内核中花费了大量时间,如果您使用大数组,则可能会处理页面错误。

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

Linux perf 中的运行时间和报告的周期计数 的相关文章

随机推荐

  • 根据外键选择填充 django-admin 中的值

    我有一个带有外键引用的模型 看起来像这样 class Plan models Model template models ForeignKey PlanTemplate throttle models IntegerField defaul
  • 设置 Java 应用程序的全局字体

    我需要为我的应用程序设置默认字体 有没有一种不依赖 LaF 的方法可以做到这一点 弄清楚了 致电 setUIFont new javax swing plaf FontUIResource new Font MS Mincho Font P
  • CloudFoundry 时区

    我开发了一个非常以 JodaTime 日期时间为中心的应用程序 日历等 在我的本地计算机上一切正常 我已在 cloudfoundry 部署了我的应用程序 但日历中没有可见的日期 我猜这和cloudfoundry的时区有关 我已将本地运行的应
  • 在谷歌应用程序脚本中以 HTML 形式获取谷歌文档[重复]

    这个问题在这里已经有答案了 如何在谷歌应用程序脚本中获取 HTML 形式的谷歌文档 例如 我可以像这样获取文档正文 DocumentApp getActiveDocument getBody 但是当我登录时什么也没有 function do
  • 如何从 iOS SDK 中的 Facebook 对象获取 Facebook 用户 ID?

    我看到 Facebook 对象中提供了访问令牌 但我没有看到 Facebook 用户 ID 我可以向 我 发出图形请求以获取 Facebook Id 但我不想进行额外的 api 调用 现在有一种简单的方法可以做到这一点 假设你已经有一个FB
  • 将图像转换为 pdf php

    我在用csxi http www chestysoft com ximage twainupload asp将文档扫描为图像 但我必须将 pdf 文件上传到服务器 如何在 php 中将图像转换为 PDF 或者有什么方法可以让 csxi 将文
  • 用于应用程序本地部署的 MSVC 2015 通用 CRT

    据宣布 通用 CRT 将是一个可重新分发的 DLL 这样应用程序本地部署仍然是可能的 我已经安装了 Visual Studio 2015 Express Edition 并且在 SDK 目录中查找 ucrtbase dll 但找不到任何内容
  • 如何添加第三方 Java JAR 文件以在 PySpark 中使用

    我有一些 Java 第三方数据库客户端库 我想通过访问它们 java gateway py 例如 要使客户端类 不是 JDBC 驱动程序 通过 Java 网关可供 Python 客户端使用 java import gateway jvm o
  • 将压缩半字节组合成压缩字节

    给定一个或多个 m128i or m256i每个 16 位元素包含一个半字节 将它们组合并打包为每个 8 位元素一个字节的最快方法是什么 即 hi lt lt 4 lo对于相邻的 16 位元素 这是我想出的最好方法 不幸的是它与标量代码相当
  • 如果内容太宽,请在 HTML 标记中插入省略号 (...)

    我有一个具有弹性布局的网页 如果调整浏览器窗口的大小 该网页会更改其宽度 在这个布局中有标题 h2 其长度可变 实际上是我无法控制的博客文章的标题 目前 如果它们比窗口宽 它们会分成两行 是否有一个优雅的 经过测试的 跨浏览器 解决方案 例
  • 如何在IOS的UIView中仅使文本/标题覆盖的部分透明

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试创建一个UIView with text the text可能会不断变化 在其之上 我只想要text其中的一部分UIView透明
  • 模拟对象上的异步回调不等待

    我试图模拟单元测试的复杂情况 mockController new Mock
  • 无法连接到 (LocalDB)\MSSQLLocalDB -> 用户“User-PC\User”登录失败

    当我尝试通过 SQL Server Management Studio 连接 LocalDB MSSQLLocalDB 时 出现错误 我还尝试使用默认数据库作为 master 登录 错误是相同的 Here is the Server det
  • JavaScript 中的嵌套层数是否有限制?

    假设您有一个非常复杂的算法 需要数十个 for 循环 JavaScript 对循环的嵌套深度有限制还是没有限制 深层嵌套 for 循环的最佳实践是什么 我尝试在 MDN 上搜索 但找不到我要找的内容 Edit 我正在寻找是否有内置限制 例如
  • Java - 接口扩展自身

    我已经使用这个网站大约 6 个月了 是时候问我的第一个问题了 因为我找不到这个问题的答案 至少不是我能理解的答案 在这段代码中 为什么这个接口要扩展自身 public interface PositionedVertex
  • DecorView子框架布局

    有人可以向我解释一下 为什么我的布局上的 DecorView 的子级是 FrameLayout 而我还没有定义它 这是xml布局
  • 观察者模式是否违反了单一责任原则?

    如果使用观察者设计模式的应用程序具有subject具有以下职责的类 1 管理和通知观察者 即提供注册和注销函数并调用所有观察者通知函数 和 2 它最初的责任 即班级在成为班级之前正在做什么subject 这个类是否违反了单一职责原则 它显然
  • jsPDF 不完整或损坏的 PNG 文件

    使用 jsPDF 添加常规 png 图像没有问题 但现在我从服务器发送生成的图像 并且浏览器控制台在渲染 PDF 文件时显示此错误 PNG 文件不完整或损坏 显然图像不是不完整或损坏的 因为我可以看到服务器的响应并且图像很好 另外 为了避免
  • 函数参数列表中的三个点是什么意思?

    我遇到了这样的函数定义 char abc char f 三个点是什么意思 这些类型的函数称为可变参数函数 维基百科链接 https en wikipedia org wiki Variadic function 他们使用省略号 即三个点 来
  • Linux perf 中的运行时间和报告的周期计数

    我在 4 核 Intel CPU 每个核心 1 个线程 上运行了单线程矩阵乘法 但 perf 中的数字没有意义 Performance counter stats for system wide 31 728 397 287 cpu cyc