http://tinylab.org/explore-linux-bogomips/

内核探索:Linux BogoMips 探秘

Tao HongLiang 创作于 2015/05/12

By Tao Hongliang of TinyLab.org 2015/04/12

1 背景

今天和往常一样,在实验室和一群攻城师同事们没日没夜的码着代码。突然,一个同学问了一句: /proc/cpuinfo (龙芯平台) 里的 BogoMIPS 和 CPU 的频率是什么关系? 一石激起千层浪,一时间各种奇葩的答案层出不穷,最终也没个定论。本攻城师决定直捣黄龙一探究竟,给迷茫的小伙伴们一个交代。

2 BogoMIPS 的由来

BogoMIPS 是 Linus 本人的独创,Bogo 意思是“假的,伪造的”,MIPS 意思是“Millions of Instructions Per Second”,如果系统启动时,计算出 BogoMIPS 为 100,可记为 100万条伪指令每秒。

之所以叫伪指令,是因为在计算 BogoMIPS 的值时,CPU 一直在单一的执行 NOP (空操作),而不是随机执行指令集中的任意指令,所以不能以此作为 CPU 的性能指标。

3 BogoMIPS 的计算

现在就让我们走进代码,看看他是怎么计算的。笔者是在 v3.13.0 版本的 Linux kernel 源码中做的实验。这一部分变动很少,其他相似版本应该无差别。 </br>

首先,在文件 arch/mips/kernel/proc.c 中给出了 BogoMIPS 的计算方式:

  1. seq_printf(m, "BogoMIPS\t\t: %u.%02u\n",
  2. cpu_data[n].udelay_val / (500000/HZ),
  3. (cpu_data[n].udelay_val / (5000/HZ)) % 100);

其中 HZ 是在内核配置的时候就确定好的常量,那在这个公式里就只剩 udelay_val 的值是未知的了。小提醒:这里是一个经典的用整型来表达浮点类型的例子,小伙伴们可以学习下。 </br>

然后,在文件 arch/mips/include/asm/bugs.h中给出了 udelay_val 的计算方式:

  1. cpu_data[cpu].udelay_val = loops_per_jiffy;

最后,在文件init/calibrate.c中,我们能找到 loops_per_jiffy 的计算方式:

  1. #define LPS_PREC 8
  2. static unsigned long calibrate_delay_converge(void)
  3. {
  4. /* First stage - slowly accelerate to find initial bounds */
  5. unsigned long lpj, lpj_base, ticks, loopadd, loopadd_base, chop_limit;
  6. int trials = 0, band = 0, trial_in_band = 0;
  7. lpj = (1<<12);
  8. /* wait for "start of" clock tick */
  9. /* 这里很聪明的选择了一个计算 loops 的起始时间,即,一个 tick 刚开始的时候 */
  10. ticks = jiffies;
  11. while (ticks == jiffies)
  12. ; /* nothing */
  13. /* Go .. */
  14. ticks = jiffies;
  15. /* 这里用逐渐逼近的方式计算在一个jiffy的时间段内,循环调用 __delay(NOP 循环),
  16. * 最后累计 delay 了多少。loops_per_jiffy 就是多少了。
  17. */
  18. do {
  19. if (++trial_in_band == (1<<band)) {
  20. ++band;
  21. trial_in_band = 0;
  22. }
  23. __delay(lpj * band);
  24. trials += band;
  25. } while (ticks == jiffies);
  26. /*
  27. * We overshot, so retreat to a clear underestimate. Then estimate
  28. * the largest likely undershoot. This defines our chop bounds.
  29. */
  30. trials -= band;
  31. loopadd_base = lpj * band;
  32. lpj_base = lpj * trials;
  33. /* 接下来,再对上面算出来的 loops_per_jiffy 的值进行微调,确保其准确 */
  34. recalibrate:
  35. lpj = lpj_base;
  36. loopadd = loopadd_base;
  37. /*
  38. * Do a binary approximation to get lpj set to
  39. * equal one clock (up to LPS_PREC bits)
  40. */
  41. chop_limit = lpj >> LPS_PREC;
  42. while (loopadd > chop_limit) {
  43. lpj += loopadd;
  44. ticks = jiffies;
  45. while (ticks == jiffies)
  46. ; /* nothing */
  47. ticks = jiffies;
  48. __delay(lpj);
  49. if (jiffies != ticks) /* longer than 1 tick */
  50. lpj -= loopadd;
  51. loopadd >>= 1;
  52. }
  53. /*
  54. * If we incremented every single time possible, presume we've
  55. * massively underestimated initially, and retry with a higher
  56. * start, and larger range. (Only seen on x86_64, due to SMIs)
  57. */
  58. if (lpj + loopadd * 2 == lpj_base + loopadd_base * 2) {
  59. lpj_base = lpj;
  60. loopadd_base <<= 2;
  61. goto recalibrate;
  62. }
  63. return lpj;
  64. }

这下我们搞清楚了 loops_per_jiffy 的实质。详细计算方式,可以参考上面代码中给出的中文注释。

  1. BogoMIPS = loops_per_jiffy ÷ (500000 / HZ) ---> BogoMIPS = (loops_per_jiffy * HZ) ÷ 500000

HZ 是什么,HZ 就是每秒的滴答数,即每秒的 jiffy 数。那么,loops_per_jiffy * HZ = loops_per_second

  1. BogoMIPS = loops_per_second ÷ 500000 ---> BogoMIPS = (loops_per_second * 2) ÷ 1000000

自此,BogoMIPS 的计算探秘结束。

4 BogoMIPS 和 CPU 频率的关系

看了上面 BogoMIPS 的计算方式,我们发现并没有一个直接的公式可以让 BogoMIPS 和 CPU 频率之间相互转换。但至少可以推断出对于同一款处理器:

  • CPU 频率越快,loops_per_second 的值必然越大,那么 BogoMIPS 的值将会越大;
  • CPU 频率越低,则 BogoMIPS 的值将越小;
  • CPU 变频的时候,BogoMIPS 会随着 CPU 频率升高而升高,降低而降低。

引用 维基百科上已有的数据,可以进一步的对于 BogoMIPS 和 CPU 频率之间的关系,有更深的感性认识:

支付宝打赏
¥9.68元
  微信打赏
¥9.68元

请作者喝杯咖啡吧

Read Related:

Read Latest:

BogoMips 和cpu主频无关 不等于cpu频率的更多相关文章

  1. 基础 - 获得CPU主频

    // 获得cpu主频.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> #include ...

  2. Cpu 主频与睿频

    主频就是一颗CPU的运行频率.比如一颗CPU是2.3G,无论是单核还是多核,所有的核心都是工作在2.3G. 睿频是Intel的一项加速技术,指当启动一个运行程序后,处理器会自动加速到合适的频率,而原来 ...

  3. 【UEFI】---关于BIOS,EIST和PState&CState和CPU主频变化得关系

    Intel处理器都支持Turbo和EIST,且一般情况下,各家厂商在BIOS中都会设置EIST和PState的开关,那么这些开关与CPU的频率的关系是什么呢?今天对此做个总结: 按照国际惯例,本次梳理 ...

  4. (四)CPU主频与”性能“

    一.什么是性能 CPU的性能就是就是时间的倒数,简单来说:耗时越少,性能越好,主要包含下面两个指标: 响应时间:程序执行耗时 吞吐率:单位时间处理数据或执行程序的量 缩短响应时间,一定时间内可以执行更 ...

  5. cpu主频信息

    yangkunvanpersie ( yangkunvanpersie@163.com ) 通过"有道云笔记"邀请您查看以下笔记 修改CPU频率.note   打开笔记 kerne ...

  6. Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算

    目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps ...

  7. CPU Rings, Privilege, and Protection.CPU的运行环, 特权级与保护

    原文标题:CPU Rings, Privilege, and Protection 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的 ...

  8. 初识CPU卡、SAM卡/CPU卡简介、SAM卡简介 【转】

    初识CPU卡.SAM卡/CPU卡简介.SAM卡简介 IC卡按照接口方式可分为接触式卡.非接触式卡.复合卡:按器件技术可分为非加密存储卡.加密存储卡和CPU卡. 加密存储卡是对持卡人的认证,只有输入正确 ...

  9. 【转帖】处理器史话 | 这张漫画告诉你,为什么双核CPU能打败四核CPU?

    处理器史话 | 这张漫画告诉你,为什么双核CPU能打败四核CPU? https://www.eefocus.com/mcu-dsp/371324 2016-10-28 10:28 作者:付丽华预计 9 ...

随机推荐

  1. 基于vite2的react脚手架

    vite-react-boilerplate 开发编译 yarn start 启动开发 yarn build 启动编译 代码质量和风格 husky/lint-staged/eslint/prettie ...

  2. Dynamics CRM修改密码界面

    我们再实施Dynamics CRM的过程中经常会被客户吐槽没有一个修改密码的页面.市面上也有一些人通过自己操作AD库进行修改密码的解决方案不过多多少少会有一些BUG存在.其实ADFS提供了一个修改密码 ...

  3. spieces-in-pieces动画编辑器

    前言: 制作灵感来源于 http://species-in-pieces.com/ 这个网站,此网站作者是来自阿姆斯特丹的设计师 Bryan James,其借用纯CSS技术表现出30种濒危动物的碎片拼 ...

  4. JavaWeb 补充(Json)

    HTML DOM alert() 方法 定义和用法 alert() 方法用于显示带有一条指定消息和一个 OK 按钮的警告框. 参数 描述 message 要在 window 上弹出的对话框中显示的纯文 ...

  5. 原创 Spring Boot 2.3 新特性分层JAR

    背景 在我们实际生产容器化部署过程中,往往会遇到 Docker 镜像很大,部署发布很慢的情况 影响 docker 镜像大小的因素,主要有以下三个方面: 基础镜像的大小 .尽量选择 aphine 作为基 ...

  6. dubbo支持哪些通信协议?支持哪些序列化协议?

    (1)dubbo支持不同的通信协议 1)dubbo协议 dubbo://192.168.0.1:20188 默认就是走dubbo协议的,单一长连接,NIO异步通信,基于hessian作为序列化协议 适 ...

  7. Java 获取资源文件路径

    1 问题描述 通过源码运行时,一般使用如下方式读取资源文件: String str = "1.jpg"; 资源文件与源码文件放在同一目录下,或者拥有同一父级目录: String s ...

  8. redis实际应用-限流

    为什么要做限流 首先让我们先看一看系统架构设计中,为什么要做"限流". 旅游景点通常都会有最大的接待量,不可能无限制的放游客进入,比如故宫每天只卖八万张票,超过八万的游客,无法买票 ...

  9. adb 简介与常用命令

    1. abd 简介 2. adb 常用命令 1. abd 简介 adb 的全称为 Android Debug Bridge,就是起到调试桥的作用. 借助 adb 工具,我们可以管理设备或手机模拟器的状 ...

  10. 3、带你一步一步学习ASP.NET Core中的配置之Configuration

    如果你是刚接触ASP.NET Core的学习的话,你会注意到:在ASP.NET Core项目中,看不到.NET Fraemwork时代中的web.config文件和app.config文件了.那么你肯 ...