3. 关于 BogoMips 的常见问题

许多作者为我关于 BogoMips 的知识做出了贡献。在此,我想对他们表示衷心的感谢。

3.1. 什么是 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 上都可用。

3.2. 如何估算适当的 BogoMips 评级应该是多少

来自 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,最新的内核可能会给出不同的数据。

3.3. 如何确定当前的 BogoMips 评级是多少

有三种方法可以确定当前的 BogoMips,即:

  1. 查看 /proc/cpuinfo,例如,使用 `cat /proc/cpuinfo`。此方法是首选的替代方法。

  2. 查看 syslog 输出,看看启动期间打印的内容。如果幸运的话,信息可能仍然在启动虚拟控制台上(如果需要,可以使用 Alt-F1 组合键切换到它),否则您可以明确地使用 dmesg 或 syslogk 检索信息。这种替代方法提供准确的信息,但工作量更大。

  3. 使用独立的 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.

3.4. BogoMips 评级的变化

来自 Linus Torvalds (torvalds@cc.helsinki.fi) 在 c.o.l.development 中于 1994 年 4 月 28 日对 BogoMips 评级变化的解释

`BogoMips 计算循环是“量化的”,因此您很可能会一直得到完全相同的数字。只有当速度恰好在“边缘”时,您通常才会得到不同的数字,这时小的变化(中断滴答的不同时间等)会使其从一个值跳到另一个值。'

如果内核不是专门为相关的 CPU 编译的,那么 BogoMips 评级也可能发生一些(甚至很大)的变化,这主要是由于错误的对齐造成的。这个问题显然只发生在各种 x86 CPU(Intel 和克隆)上。幸运的是,它可以很容易地解决:专门为您的 CPU 重新编译内核。

3.5. 新的 BogoMips 算法?

不,与普遍的看法相反,BogoMips 算法在各个内核版本中都没有改变。此外,对于所有制造商的所有 CPU,它本质上是相同的。

从内核版本 2.2.13 到 2.2.14 发生变化的是 BogoMips 计算之前的 CPU 状态设置。这影响了所有 Intel 和 AMD Pentium 变体的 BogoMips 评级,导致大约 2* 时钟,如果它们还不是 2* 时钟的话。

基于这些升级内核版本的条目,对于实际上与此更改相关的 CPU(Pentium II/III、Celeron、Athlon),在下面的列表中用初始 *(星号)符号标记。

3.6. BogoMips ... 失败

根据网上和私人邮件中的各种问题建议,例如,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 以来,许多错误消息都得到了改进,因此请升级到至少该版本以找出哪个特定驱动程序失败了。另请重新编译内核,使其仅包含您的硬件配置实际需要的驱动程序。

3.7. 克隆 CPU(Cyrix、NexGen、AMD 等)怎么样

类似 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 乘数。

3.8. 为什么要关注 BogoMips

让我补充一点,关注 Linux 启动时显示的 BogoMips 评级只有两个原因:

  1. 看看它是否在特定处理器、其时钟频率以及可能存在的缓存的适当范围内。许多 CPU 容易出现以下错误的设置:

    • 内存缓存设置(回写对于 BogoMips 是错误的,通常报告低于 5;直写是正常的)

    • 加速按钮(应为 ON)

    • BIOS 软件模拟的假缓存(将其更改为真缓存)

    • 类似的缓存和时钟相关的东西,有时也与 BIOS 软件有关

  2. 看看您的系统是否比我的系统更快。当然,这是完全错误、不可靠、毫无根据且完全无用的,但所有基准测试都存在同样的问题。那么为什么不使用它呢?这种内在的愚蠢行为以前从未阻止人们使用基准测试,不是吗? :-)

    作者注:此评论是在 90 年代中期,当比较一些低容量 CPU 的高 BogoMips 率(具有高时钟频率,例如 486)与具有较低时钟频率但容量更大的 CPU 的速率(例如 Pentium)时做出的。

Andre D. Balsa 的 Linux 基准测试指南中讨论了更严肃的真实基准测试用途。