许多作者为我关于 BogoMips 的知识做出了贡献。在此,我想对他们表示衷心的感谢。
引自互联网,来源不明,但由 Eric S Raymond (esr@thyrsus.com) 和 Geoff Mackenzie (freon@dialstart.net) 引起关注,对 BogoMips 有一个幽默的说明性定义,即“处理器每秒可以完全空转的百万次数量。”
更精确的说法,来自 Lars Wirzenius (wirzeniu@kruuna.Helsinki.FI) 1993 年 9 月 9 日的邮件,解释了 BogoMips,并由 Alessandro Rubini (rubini@morgana.systemy.it) 和 howto 作者 Wim van Dorst 提供了额外的详细信息
`MIPS 是 Millions of Instructions Per Second(每秒百万指令)的缩写。它是衡量程序计算速度的指标。像大多数此类指标一样,它更多时候是被滥用而不是正确使用(公正地比较不同类型计算机的 MIPS 非常困难)。
BogoMips 是 Linus 自己的发明。Linux 内核版本 0.99.11(日期为 1993 年 7 月 11 日)需要一个定时循环(时间太短和/或需要太精确,无法使用非忙等待循环方法),该循环必须根据机器的处理器速度进行校准。因此,内核在启动时测量计算机上特定类型的忙循环运行速度。“Bogo”来自“bogus”,即伪造的东西。因此,BogoMips 值给出了一些处理器速度的指示,但它太不科学了,不能被称为 BogoMips 以外的任何名称。
在启动期间打印它的原因(有两个)是 a) 它对调试和检查计算机的缓存和加速按钮是否工作稍微有用,以及 b) Linus 喜欢看到人们在新闻中感到困惑时会发出笑声。'
BogoMips 的确定在/usr/src/linux/init/main.c中(简单的 C 算法,在完全整数内核中有一个很好的浮点算术示例),并且相关的内核变量 loops_per_sec 在几个驱动程序中用于更严肃的目的。实际的延迟函数udelay()在汇编程序中,因此每个端口在/include/asm/delay.h中都有自己的定义。loops_per_sec 变量和udelay()函数在许多驱动程序中使用,请参阅
cd /usr/src/linux #or where else source is located find . -name '*.[hcS]' -exec fgrep loops_per_sec {} /dev/null \; find . -name '*.[hcS]' -exec fgrep udelay {} /dev/null \;
非 Intel CPU 的 BogoMips 计算循环是相似但不相同的,因为它是在另一种汇编语言中编程的。然而,BogoMips 是在各种 CPU(Intel 类型和非 Intel 类型)上获得 CPU 速度指示的唯一可移植方法。即使 CPU 时钟速度也不是在所有 CPU 上都可用。
来自 Ian Jackson (ijackson@nyx.cs.du.edu) 和 Przemek Klosowski 的倡议,当时只有三四个条目,由 howto 作者 Wim van Dorst 大量更新和扩展,用于当前数据,如下所示
作为一个非常粗略的指南,BogoMips 可以通过以下方式计算:
System BogoMips Comparison Intel 8088 clock * 0.004 0.02 Intel/AMD 386SX clock * 0.14 0.8 Intel/AMD 386DX clock * 0.18 1 (definition) Motorola 68030 clock * 0.25 1.4 Cyrix/IBM 486 clock * 0.34 1.8 Intel Pentium clock * 0.40 2.2 Intel 486 clock * 0.50 2.8 AMD 5x86 clock * 0.50 2.8 Mips R4000/R4400 clock * 0.50 2.8 Motorola 68040 clock * 0.67 3.7 PowerPC 603 clock * 0.67 3.7 Intel StrongArm clock * 0.66 3.7 Nexgen Nx586 clock * 0.75 4.2 PowerPC 601 clock * 0.84 4.7 Alpha 21064/21064A clock * 0.99 5.5 Alpha 21066/21066A clock * 0.99 5.5 Alpha 21164/21164A clock * 0.99 5.5 Intel Pentium Pro clock * 0.99 5.5 Cyrix 5x86/6x86 clock * 1.00 5.6 Intel Pentium II/III clock * 1.00 5.6 AMD K7/Athlon clock * 1.00 5.6 Intel Celeron clock * 1.00 5.6 Intel Itanium clock * 1.00 5.6 Mips R4600 clock * 1.00 5.6 Intel Itanium 2 clock * 1.49 8.3 Alpha 21264 clock * 1.99 11.1 Centaur VIA clock * 1.99 11.1 AMD K5/K6/K6-2/K6-III clock * 2.00 11.1 AMD Athlon XP/Athlon 64 clock * 2.00 11.1 AMD Duron/Opteron clock * 2.00 11.1 UltraSparc II clock * 2.00 11.1 Pentium MMX clock * 2.00 11.1 Pentium 4 clock * 2.00 11.1 Centaur C6-2 clock * 2.00 11.1 PowerPC 604/604e/750 clock * 2.00 11.1 Motorola 68060 clock * 2.01 11.2 Intel Xeon (hyperthreading) clock * 3.97 22.1 Hitachi SH-4 not enough data (yet) IBM S390 not enough data (yet) Intel ARM not enough data (yet)
请注意,BogoMips 计算循环没有充分利用各种处理器的并行性,例如 Intel Pentium 和 Alpha 21164。另请阅读下面关于“新的 BogoMips 算法?”的部分,因为对于其中一些 CPU,最新的内核可能会给出不同的数据。
有三种方法可以确定当前的 BogoMips,即:
查看 /proc/cpuinfo,例如,使用 `cat /proc/cpuinfo`。此方法是首选的替代方法。
查看 syslog 输出,看看启动期间打印的内容。如果幸运的话,信息可能仍然在启动虚拟控制台上(如果需要,可以使用 Alt-F1 组合键切换到它),否则您可以明确地使用 dmesg 或 syslogk 检索信息。这种替代方法提供准确的信息,但工作量更大。
使用独立的 bogomips 程序。仅建议用于非 Linux 系统,原因如下所述。
对于非 Linux 系统(如 Crays、Palm PDA、DOS 和类似系统),一种非确定性的替代方法可能是独立的 BogoMips 程序。目前有一些版本可用,例如,Darrick Wong (djwong@thibs.menloschool.org) 和 Philip Snowdon (philips@users.sf.net) 的版本。Jeff Tranter (jeff_tranter@mitel.com) 是原始作者。来自他的自述文件
`厌倦了重启系统以便查看今天运行的 BogoMips 数量?[...] “Bogomips”是一个独立程序,它使用世界上最受认可的基准测试之一来显示您的系统性能。它使用与 Linux 内核在启动时使用的代码相同的代码,但作为用户程序运行。[...] BogoMips 1.3 版本现在是可移植的,应该可以在任何支持 ANSI C 编译器和库的系统上运行。'
请注意,由于系统负载,在 Linux 系统上使用独立程序计算的值可能与下面列表中注册的值大相径庭。本质上,独立程序无法提供与启动序列 BogoMips 完全相似的信息,因为系统负载将与普通用户运行的程序竞争。因此,下面仅列出了启动序列 BogoMips 评级。
请注意 Jeff 的原始文件在sunsite.unc.edu中,名为/pub/Linux/system/status/bogo-1.2.tar.gz,内部指定版本 1.3,已经过时了。因此,请查看 Darrick 的程序,网址为http://thibs.menloschool.org/~djwong/programs/bogomips/,如果仍然可以访问。他甚至有一个 MSW*nd*ws 二进制版本。非常有趣的是,Phil Snowdon 开发了 PalmOS 版本,可以在http://bogomips.sourceforge.net.
来自 Linus Torvalds (torvalds@cc.helsinki.fi) 在 c.o.l.development 中于 1994 年 4 月 28 日对 BogoMips 评级变化的解释
`BogoMips 计算循环是“量化的”,因此您很可能会一直得到完全相同的数字。只有当速度恰好在“边缘”时,您通常才会得到不同的数字,这时小的变化(中断滴答的不同时间等)会使其从一个值跳到另一个值。'
如果内核不是专门为相关的 CPU 编译的,那么 BogoMips 评级也可能发生一些(甚至很大)的变化,这主要是由于错误的对齐造成的。这个问题显然只发生在各种 x86 CPU(Intel 和克隆)上。幸运的是,它可以很容易地解决:专门为您的 CPU 重新编译内核。
不,与普遍的看法相反,BogoMips 算法在各个内核版本中都没有改变。此外,对于所有制造商的所有 CPU,它本质上是相同的。
从内核版本 2.2.13 到 2.2.14 发生变化的是 BogoMips 计算之前的 CPU 状态设置。这影响了所有 Intel 和 AMD Pentium 变体的 BogoMips 评级,导致大约 2* 时钟,如果它们还不是 2* 时钟的话。
基于这些升级内核版本的条目,对于实际上与此更改相关的 CPU(Pentium II/III、Celeron、Athlon),在下面的列表中用初始 *(星号)符号标记。
根据网上和私人邮件中的各种问题建议,例如,Lily (lbliao@alumni.caltech.edu) 和 Pierre Frenkiel (frenkiel@cdfap2.in2p3.fr)。他们在 1995 年 3 月询问
`当我启动 Linux 时,我收到消息
校准延迟循环在哪里/为什么失败了?'
Calibrating delay loop.. ok - 23.96 BogoMips failed
Calibrating delay loop.. failed
可能失败的是您机器中可能没有的某些小工具的驱动程序。在计算 BogoMips 评级后,所有设备驱动程序都会被初始化。首先是 SCSI 设备,然后是网络设备等。任何故障都会如实报告。值得注意的是 AHA152x 驱动程序。驱动程序故障的其他影响(而不是 BogoMips 计算失败的影响)是系统崩溃、长时间等待以及完全系统锁定,在输出 ok - xx.xx BogoMips 文本附近(刚好之前或之后)。
自从 Linux 1.2 以来,许多错误消息都得到了改进,因此请升级到至少该版本以找出哪个特定驱动程序失败了。另请重新编译内核,使其仅包含您的硬件配置实际需要的驱动程序。
类似 Cyrix 486 的 CPU 需要缓存启用软件,有时称为 BogoBoost 软件。Cyrix 5x86 和 6x86 CPU 可以通过分支预测(BIOS 选项)大幅提高其 BogoMips。请注意,性能提升可能很小。有几个软件包可用于调整 Cyrix CPU,例如 BogoBoost 补丁、cx5x86mod 和 set6x86,所有这些都来自普通的存档,位置显而易见。据报道,当内核使用 486 优化而不是 Pentium 优化编译时,Cyrix 6x86 CPU 可能会提供更好的性能。
NexGen 386 增强型 CPU,标记为 Nx586,被列为类似 386 的 CPU,因为它们像 Pentium 机器一样运行的事实与 BogoMips 无关。
AMD 5x86,也表示为 AMD 486DX5,是四倍速 486/33 机器。它们完全符合其他 486 CPU 的标准。AMD K5 和 K6 是类似 Pentium 的 CPU,具有自己的 BogoMips 乘数。
让我补充一点,关注 Linux 启动时显示的 BogoMips 评级只有两个原因:
看看它是否在特定处理器、其时钟频率以及可能存在的缓存的适当范围内。许多 CPU 容易出现以下错误的设置:
内存缓存设置(回写对于 BogoMips 是错误的,通常报告低于 5;直写是正常的)
加速按钮(应为 ON)
BIOS 软件模拟的假缓存(将其更改为真缓存)
类似的缓存和时钟相关的东西,有时也与 BIOS 软件有关
看看您的系统是否比我的系统更快。当然,这是完全错误、不可靠、毫无根据且完全无用的,但所有基准测试都存在同样的问题。那么为什么不使用它呢?这种内在的愚蠢行为以前从未阻止人们使用基准测试,不是吗? :-)
作者注:此评论是在 90 年代中期,当比较一些低容量 CPU 的高 BogoMips 率(具有高时钟频率,例如 486)与具有较低时钟频率但容量更大的 CPU 的速率(例如 Pentium)时做出的。
Andre D. Balsa 的 Linux 基准测试指南中讨论了更严肃的真实基准测试用途。