BogoMips:修订间差异
小 Bot更新:超过3个月未有翻译,标记清理 |
過期翻譯 |
||
第1行: | 第1行: | ||
{{过期翻译|time=2011-04-18T11:41:02}} |
|||
{{translating|time=2011-04-18T11:41:01+00:00}} |
|||
{{wikify|time=2011-04-18T11:41:01+00:00}} |
{{wikify|time=2011-04-18T11:41:01+00:00}} |
||
'''BogoMips''' ("[[bogus]]" 和[[MIPS]], 伪MIPS) 是一种衡量CPU速度的不科学的方法。当计算机内核启动时,将执行一个计数循环。<br> |
'''BogoMips''' ("[[bogus]]" 和[[MIPS]], 伪MIPS) 是一种衡量CPU速度的不科学的方法。当计算机内核启动时,将执行一个计数循环。<br> |
||
第106行: | 第104行: | ||
|[[ARM architecture|ARM]]||not enough data (yet)|| |
|[[ARM architecture|ARM]]||not enough data (yet)|| |
||
|} |
|} |
||
With the 2.2.14 Linux kernel, a [[cache|caching]] setting of the CPU state was moved from behind to before the BogoMips calculation. Although the BogoMips algorithm itself wasn't changed, from that kernel onward the BogoMips rating for then current Pentium CPUs was twice that of the rating before the change. The changed BogoMips outcome had no effect on real processor performance. |
|||
== BogoMIPS 怎么计算的? == |
== BogoMIPS 怎么计算的? == |
||
第168行: | 第164行: | ||
== 外部链接 == |
== 外部链接 == |
||
* [http://www.clifton.nl/bogomips.html BogoMips Mini-Howto, V38] |
* [http://www.clifton.nl/bogomips.html BogoMips Mini-Howto, V38] |
||
This article includes material from the [[Free On-line Dictionary of Computing]], which is licensed under the [[GFDL]]. |
|||
{{DEFAULTSORT:Bogomips}} |
{{DEFAULTSORT:Bogomips}} |
2011年7月19日 (二) 00:22的版本
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 (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.0 1.1 Van Dorst, Wim. BogoMips Mini-Howto V38. 2 March 2006 [2008-08-22].
外部链接