BogoMips

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

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

合适的BogoMips比率

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

CPU比率指数
Intel 8088clock * 0.0040.02
Intel/AMD 386SXclock * 0.140.8
Intel/AMD 386DXclock * 0.181 (definition)
Motorola 68030clock * 0.251.4
Cyrix/IBM 486clock * 0.341.8
Intel Pentiumclock * 0.402.2
Intel 486clock * 0.502.8
AMD 5x86clock * 0.502.8
MIPS R4000/R4400clock * 0.502.8
ARM9clock * 0.502.8
Motorola 8081clock * 0.653.6
Motorola 68040clock * 0.673.7
PowerPC 603clock * 0.673.7
Intel StrongARMclock * 0.663.7
NexGen Nx586clock * 0.754.2
PowerPC 601clock * 0.844.7
Alpha 21064/21064Aclock * 0.995.5
Alpha 21066/21066Aclock * 0.995.5
Alpha 21164/21164Aclock * 0.995.5
Intel Pentium Proclock * 0.995.5
Cyrix 5x86/6x86clock * 1.005.6
Intel Pentium II/IIIclock * 1.005.6
AMD K7/Athlonclock * 1.005.6
Intel Celeronclock * 1.005.6
Intel Itaniumclock * 1.005.6
R4600clock * 1.005.6
Hitachi SH-4clock * 1.005.6
Intel Itanium 2clock * 1.498.3
Alpha 21264clock * 1.9911.1
VIA Centaurclock * 1.9911.1
AMD K5/K6/K6-2/K6-IIIclock * 2.0011.1
AMD Duron/Athlon XPclock * 2.0011.1
AMD Sempronclock * 2.0011.1
UltraSparc IIclock * 2.0011.1
Intel Pentium MMXclock * 2.0011.1
Intel Pentium 4clock * 2.0011.1
Intel Pentium Mclock * 2.0011.1
Intel Core Duoclock * 2.0011.1
Intel Core 2 Duoclock * 2.0011.1
Intel Atom N455clock * 2.0011.1
Centaur C6-2clock * 2.0011.1
PowerPC 604/604e/750clock * 2.0011.1
Intel Pentium III Coppermineclock * 2.0011.1
Intel Pentium III Xeonclock * 2.0011.1
Motorola 68060clock * 2.0111.2
Intel Xeon MP (32-bit) (hyper-threading)clock * 3.9722.1
IBM S390not enough data (yet)
ARMnot 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. Van Dorst, Wim. V38. 2 March 2006 [2008-08-22]. (原始内容存档于2013-08-27).

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.