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. 问题笔记-vueCli3.0打包路径出错

    需求:vueCli3.0打包路径出错.解决办法:vueCli3.0打包,新版本更新脚手架做出精简,webpack配置文件需要手动配置.在文件根目录创建一个vue.config.js配置文件.基本版: ...

  2. Postman 使用小技巧/指南

    一.什么是 Postman(前世今生) Postman 诞生于 2013 年,一开始只是 Abhinav Asthana 着手于解决 API 测试的工具,随着这个工具的使用者和需求迅速激增,Abhin ...

  3. Java(1-24)【前言、入门程序、常量、变量、类型转换】

    如何输出规定结果,利用String.format System.out.println(String.format("%.2f", f)); 编译:是指将我们编写的Java源文件翻 ...

  4. Java(41-55)【 流程控制语句】

    1. 2.练习题if语句的使用 3.选择语句 4. 5.循环结构 6.continue和break

  5. HMS Toolkit自动化环境配置,助您高效集成HMS Core

    HMS Toolkit是一个IDE插件,提供包括应用创建.编码和转换.调测和测试.提交上架等多个端到端开发工具,借助HMS Toolkit可提升3倍以上集成开发效率,可以帮助开发者以更高的开发效率.更 ...

  6. 数据结构与算法-江西师范大学865(针对考研or面试)

    可以加我微信chenyoudea免费要江西师范大学865资料全套pdf 目录 第一篇 数据结构与算法(针对考研or面试) 第二篇 真题演练 第三篇 复试 第四篇 推荐阅读 第一篇 数据结构与算法(针对 ...

  7. k8s集群移除node

    先drain节点上的pod 使用kubectl drain node03 --delete-local-data --force --ignore-daemonsets 之后删除node [root@ ...

  8. kafka管理工具-kafka manager安装

    kafka-manager 简介 # 项目信息 https://github.com/yahoo/kafka-manager 安装 环境要求: Kafka 0.8.. or 0.9.. or 0.10 ...

  9. 【ElasticSearch】ElasticSearch集群扫盲

    Cluster 集群 ⼀个 Elasticsearch 集群由⼀个或多个节点(Node)组成,每个集群都有⼀个共同的集群名称作为标识.   Node节点 ⼀个 Elasticsearch 实例即⼀个 ...

  10. thinkphp5安装php高版本出现No input file specified.解决

    <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{RE ...