跳转到内容

BogoMips:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
過期翻譯
无编辑摘要
 
(未显示10个用户的13个中间版本)
第1行: 第1行:
{{noteTA|G1=IT}}
{{wikify|time=2011-04-18T11:41:01+00:00}}
{{Rough translation|time=2023-06-28T09:36:23+00:00}}
'''BogoMips''' ("[[bogus]]"[[MIPS]], 伪MIPS) 是一种衡量CPU速度的不科学方法。当计算机内核启动时,将执行一个计数循环。<br>
{{Expand language|en|time=2023-06-28T09:36:23+00:00}}
对于特定的CPU,BogoMips可用来查看它是否个合适的值.它的时钟频率和它潜在的CPU缓存。但是它不可在不同的CPU间进行比较演示。<ref name=howto>{{cite web | first = Wim | last = Van Dorst | url = http://www.clifton.nl/bogomips.html | title = BogoMips Mini-Howto | edition = V38 | date = 2 March 2006 | accessdate = 2008-08-22}}</ref>
'''BogoMips''' ("bogus"[[每秒百萬指令|MIPS]]伪MIPS) 是一种衡量CPU速度的不科学方法。当计算机内核启动时,将执行一个计数循环。


对于特定的CPU,BogoMips可用来查看它是否个合适的值它的时钟频率和它潜在的CPU缓存。但是它不可在不同的CPU间进行比较演示。<ref name="howto">{{cite web | first = Wim | last = Van Dorst | url = http://www.clifton.nl/bogomips.html | title = BogoMips Mini-Howto | edition = V38 | date = 2 March 2006 | accessdate = 2008-08-22 | archive-date = 2013-08-27 | archive-url = https://www.webcitation.org/6JAzWvwZk?url=http://www.clifton.nl/bogomips.html | dead-url = no }}</ref>
== 合适的BogoMips比率==

== 合适的BogoMips比率 ==
作为一个参考向导,BogoMips可以用下列的表格进行预计算。给出的比率是以应用到LINUX版本的CPU作为例子。指数是指其它CPU同Intel 386DX CPU的BogoMips/clock speed比率.
作为一个参考向导,BogoMips可以用下列的表格进行预计算。给出的比率是以应用到LINUX版本的CPU作为例子。指数是指其它CPU同Intel 386DX CPU的BogoMips/clock speed比率.
{| class="sortable wikitable"
{| class="sortable wikitable"
第106行: 第109行:


== BogoMIPS 怎么计算的? ==
== BogoMIPS 怎么计算的? ==
在当前内核(2.6.x),BogoMIPS实现在内核源文件<code>/usr/src/linux/init/calibrate.c</code>。它计算了Linux内核定时参数<code>loops_per_jiffy</code> (see [[Jiffy (time)]] ) 值。源码解释如下:
在当前内核(2.6.x),BogoMIPS实现在内核源文件<code>/usr/src/linux/init/calibrate.c</code>。它计算了Linux内核定时参数<code>loops_per_jiffy</code> (see {{tsl|en|Jiffy (time)||Jiffy}} ) 值。源码解释如下:
<pre><nowiki>
<pre><nowiki>
/*
/*
第128行: 第131行:
</nowiki></pre>
</nowiki></pre>


<code>loops_per_jiffy</code> is used to implement <code>udelay<code> (delay in microseconds) and <code>ndelay</code> (delay in nanoseconds) functions. These functions are needed by some drivers to wait for hardware. Note that a [[busy waiting]] technique is used, so the kernel is effectively blocked when executing <code>ndelay/udelay</code> functions. For i386 architecture <code>delay_loop</code> is implemented in <code>/usr/src/linux/arch/i386/lib/delay.c</code> as:
<code>loops_per_jiffy</code> is used to implement <code>udelay</code> (delay in microseconds) and <code>ndelay</code> (delay in nanoseconds) functions. These functions are needed by some drivers to wait for hardware. Note that a [[busy waiting]] technique is used, so the kernel is effectively blocked when executing <code>ndelay/udelay</code> functions. For i386 architecture <code>delay_loop</code> is implemented in <code>/usr/src/linux/arch/i386/lib/delay.c</code> as:
<source lang="c">
<syntaxhighlight lang="c">
/* simple loop based delay: */
/* simple loop based delay: */
static void delay_loop(unsigned long loops)
static void delay_loop(unsigned long loops)
第144行: 第147行:
:"0" (loops));
:"0" (loops));
}
}
</syntaxhighlight>
</source>


用C语言重写的代码如下:
用C语言重写的代码如下:
<source lang="c">
<syntaxhighlight lang="c">
static void delay_loop(long loops)
static void delay_loop(long loops)
{
{
第155行: 第158行:
} while (d0 >= 0);
} while (d0 >= 0);
}
}
</syntaxhighlight>
</source>


关于BogoMips更丰富更全的信息和数百篇相关文章可参见 BogoMips mini-Howto.<ref name=howto/>
关于BogoMips更丰富更全的信息和数百篇相关文章可参见 BogoMips mini-Howto.<ref name=howto/>
第163行: 第166行:


== 外部链接 ==
== 外部链接 ==
* [http://www.clifton.nl/bogomips.html BogoMips Mini-Howto, V38]
* [http://www.clifton.nl/bogomips.html BogoMips Mini-Howto, V38]{{Wayback|url=http://www.clifton.nl/bogomips.html |date=20130530163229 }}



{{DEFAULTSORT:Bogomips}}
{{DEFAULTSORT:Bogomips}}
[[Category:Linux内核]]
[[Category:计算机基准]]


[[en:BogoMips]]
[[Category:Linux內核]]
[[Category:计算机性能测试]]
[[de:BogoMips]]
[[es:BogoMips]]
[[fr:BogoMips]]
[[it:BogoMips]]
[[nl:BogoMips]]
[[ja:BogoMips]]
[[pl:BogoMips]]
[[ru:BogoMIPS]]

2024年9月19日 (四) 09:47的最新版本

BogoMips ("bogus"與MIPS,伪MIPS) 是一种衡量CPU速度的不科学方法。当计算机内核启动时,将执行一个计数循环。

对于特定的CPU,BogoMips可用来查看它是否个合适的值。它的时钟频率和它潜在的CPU缓存。但是它不可在不同的CPU间进行比较演示。[1]

合适的BogoMips比率

[编辑]

作为一个参考向导,BogoMips可以用下列的表格进行预计算。给出的比率是以应用到LINUX版本的CPU作为例子。指数是指其它CPU同Intel 386DX CPU的BogoMips/clock speed比率.

CPU 比率 指数
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
ARM9 clock * 0.50 2.8
Motorola 8081 clock * 0.65 3.6
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
R4600 clock * 1.00 5.6
Hitachi SH-4 clock * 1.00 5.6
Intel Itanium 2 clock * 1.49 8.3
Alpha 21264 clock * 1.99 11.1
VIA Centaur clock * 1.99 11.1
AMD K5/K6/K6-2/K6-III clock * 2.00 11.1
AMD Duron/Athlon XP clock * 2.00 11.1
AMD Sempron clock * 2.00 11.1
UltraSparc II clock * 2.00 11.1
Intel Pentium MMX clock * 2.00 11.1
Intel Pentium 4 clock * 2.00 11.1
Intel Pentium M clock * 2.00 11.1
Intel Core Duo clock * 2.00 11.1
Intel Core 2 Duo clock * 2.00 11.1
Intel Atom N455 clock * 2.00 11.1
Centaur C6-2 clock * 2.00 11.1
PowerPC 604/604e/750 clock * 2.00 11.1
Intel Pentium III Coppermine clock * 2.00 11.1
Intel Pentium III Xeon clock * 2.00 11.1
Motorola 68060 clock * 2.01 11.2
Intel Xeon MP (32-bit) (hyper-threading) clock * 3.97 22.1
IBM S390 not enough data (yet)
ARM not enough data (yet)

BogoMIPS 怎么计算的?

[编辑]

在当前内核(2.6.x),BogoMIPS实现在内核源文件/usr/src/linux/init/calibrate.c。它计算了Linux内核定时参数loops_per_jiffy (see Jiffy英语Jiffy (time) ) 值。源码解释如下:

 /*
   * A simple loop like
   *  while ( jiffies < start_jiffies+1)
   *    start = read_current_timer();
   * will not do. As we don't really know whether jiffy switch
   * happened first or timer_value was read first. And some asynchronous
   * event can happen between these two events introducing errors in lpj.
   *
   * So, we do
   * 1. pre_start <- When we are sure that jiffy switch hasn't happened
   * 2. check jiffy switch
   * 3. start <- timer value before or after jiffy switch
   * 4. post_start <- When we are sure that jiffy switch has happened
   *
   * Note, we don't know anything about order of 2 and 3.
   * Now, by looking at post_start and pre_start difference, we can
   * check whether any asynchronous event happened or not
   */

loops_per_jiffy is used to implement udelay (delay in microseconds) and ndelay (delay in nanoseconds) functions. These functions are needed by some drivers to wait for hardware. Note that a busy waiting technique is used, so the kernel is effectively blocked when executing ndelay/udelay functions. For i386 architecture delay_loop is implemented in /usr/src/linux/arch/i386/lib/delay.c as:

/* simple loop based delay: */
static void delay_loop(unsigned long loops)
{
  int d0;

  __asm__ __volatile__(
    "\tjmp 1f\n"
    ".align 16\n"
    "1:\tjmp 2f\n"
    ".align 16\n"
    "2:\tdecl %0\n\tjns 2b"
    :"=&a" (d0)
    :"0" (loops));
}

用C语言重写的代码如下:

static void delay_loop(long loops)
{
  long d0 = loops;
  do {
    --d0;
  } while (d0 >= 0);
}

关于BogoMips更丰富更全的信息和数百篇相关文章可参见 BogoMips mini-Howto.[1]

参考

[编辑]
  1. ^ 1.0 1.1 Van Dorst, Wim. BogoMips Mini-Howto V38. 2 March 2006 [2008-08-22]. (原始内容存档于2013-08-27). 

外部链接

[编辑]