BogoMips

Ajustar Compartir Imprimir Citar
Medición científica de la velocidad de CPU realizada por el núcleo Linux

BogoMips (de "bogus" y MIPS) es una medida cruda de la velocidad de la CPU realizada por el kernel de Linux cuando arranca para calibrar un ciclo interno ocupado. Una definición del término que se cita a menudo es "la cantidad de millones de veces por segundo que un procesador no puede hacer absolutamente nada".

BogoMips es un valor que se puede usar para verificar si el procesador en cuestión se encuentra en el rango adecuado de procesadores similares, es decir, BogoMips representa la frecuencia de reloj de un procesador, así como la memoria caché de la CPU potencialmente presente. No se puede utilizar para comparaciones de rendimiento entre diferentes CPU.

Historia

En 1993, Lars Wirzenius publicó un mensaje de Usenet explicando las razones de su introducción en el kernel de Linux en comp.os.linux:

[...]
MIPS es corto para Millones de Instrucciones por segundo. Es una medida para la velocidad de cálculo de un procesador. Al igual que la mayoría de estas medidas, es más a menudo abusado que utilizado adecuadamente (es muy difícil comparar MIPS de forma justa para diferentes tipos de computadoras).
BogoMips son la propia invención de Linus. La versión del kernel de linux 0.99.11 (de fecha 11 de julio de 1993) necesitaba un bucle de tiempo (el tiempo es demasiado corto y/o necesita ser demasiado exacto para un método de espera no-busy-loop), que debe ser calibrado a la velocidad del procesador de la máquina. Por lo tanto, el núcleo mide a tiempo de arranque lo rápido que un cierto tipo de bucle ocupado funciona en un ordenador. "Bogo" viene de "bogus", es decir, algo que es falso. Por lo tanto, el valor BogoMips da alguna indicación de la velocidad del procesador, pero es demasiado poco científico para ser llamado cualquier cosa excepto BogoMips.
Las razones (hay dos) se imprimen durante el arranque es que a) es ligeramente útil para depurar y para comprobar que el ordenador ['] los caches y el trabajo del botón del turbo, y b) Linus le encanta reír cuando ve a gente confundida en las noticias.
[...]

Calificaciones adecuadas de BogoMips

Como guía muy aproximada, los BogoMips se pueden precalcular mediante la siguiente tabla. La calificación dada es típica para esa CPU con la versión de Linux actual y aplicable en ese momento. El índice es la proporción de "BogoMips por velocidad de reloj" para cualquier CPU al mismo para una CPU Intel 386DX, para fines de comparación.

SistemaValoraciónÍndice
Intel 8088reloj × 0,0040,02
Intel/AMD 386SXreloj × 0.140,8
Intel/AMD 386DXreloj × 0.181 (definición)
Motorola 68030reloj × 0.251.4
Cyrix/IBM 486reloj × 0.341.8
Pentium Intelreloj × 0.402.2
Intel 486reloj × 0.502.8
AMD 5x86reloj × 0.502.8
MIPS R4000/R4400reloj × 0.502.8
ARM9reloj × 0.502.8
Motorola 68040reloj × 0,6773.7
PowerPC 603reloj × 0,6773.7
Intel StrongARMreloj × 0.663.7
NexGen Nx586reloj × 0,7554.2
PowerPC 601reloj × 0,844.7
Alpha 21064/21064Areloj × 0.995,5
Alpha 21066/21066Areloj × 0.995,5
Alpha 21164/21164Areloj × 0.995,5
Intel Pentium Proreloj × 0.995,5
Cyrix 5x86/6x86reloj × 1.005.6
Intel Pentium II/IIIreloj × 1.005.6
AMD K7/Athlonreloj × 1.005.6
Intel Celeronreloj × 1.005.6
Intel Itaniumreloj × 1.005.6
R4600reloj × 1.005.6
Hitachi SH-4reloj × 1.005.6
Raspberry Pi (Model B)reloj × 1.005.6
Intel Itanium 2reloj × 1.498.3
Alpha 21264reloj × 1.9911.1
VIA Centaurreloj × 1.9911.1
AMD K5/K6/K6-2/K6-IIIreloj × 2.0011.1
AMD Duron/Athlon XPreloj × 2.0011.1
AMD Sempronreloj × 2.0011.1
UltraSparc IIreloj × 2.0011.1
Intel Pentium MMXreloj × 2.0011.1
Pentium Intel 4reloj × 2.0011.1
Intel Pentium Mreloj × 2.0011.1
Intel Core Duoreloj × 2.0011.1
Intel Core 2 Duoreloj × 2.0011.1
Intel Atom N455reloj × 2.0011.1
Centaur C6-2reloj × 2.0011.1
PowerPC 604/604e/750reloj × 2.0011.1
Intel Pentium III Copperminereloj × 2.0011.1
Intel Pentium III Xeonreloj × 2.0011.1
Motorola 68060reloj × 2.0011.1
Intel Xeon MP (32-bit) (hiper-threading)reloj × 3.9722.1
IBM S390no suficientes datos (sí)
ARMno suficientes datos (sí)

Con el kernel de Linux 2.2.14, una configuración de almacenamiento en caché del estado de la CPU se movió desde atrás hasta antes del cálculo de BogoMips. Aunque el algoritmo de BogoMips en sí no se modificó, desde ese núcleo en adelante, la calificación de BogoMips para las CPU Pentium actuales era el doble de la calificación antes del cambio. El resultado modificado de BogoMips no tuvo efecto en el rendimiento real del procesador.

En Linux, BogoMips se puede obtener fácilmente buscando en el archivo cpuinfo:

$ grep -i bogomips /proc/cpuinfo

Cálculo de BogoMIPS

Con el kernel 2.6.x, BogoMIPS se implementa en el archivo fuente del kernel /usr/src/linux/init/calibrate.c. Calcula el valor del parámetro de temporización del kernel de Linux loops_per_jiffy (ver jiffy). La explicación del código fuente:

 /*
* Un simple bucle como
* while (jiffies ■ start_jiffies+1)
* start = read_current_timer();
* no lo hará. Como realmente no sabemos si el interruptor de jiffy
* sucedió primero o timer_value fue leído primero. Y algunos asincrónicos
* evento puede ocurrir entre estos dos eventos introduciendo errores en lpj.
*
* Así que, lo hacemos
* 1. pre_start Cuando estamos seguros de que el interruptor de jiffy no ha pasado
* 2. Comprueba el interruptor de jiffy
* 3. iniciar - valor temporizador antes o después del interruptor de jiffy
* 4. post_start Cuando estamos seguros de que el interruptor de jiffy ha pasado
*
* Nota, no sabemos nada sobre el orden de 2 y 3.
* Ahora, mirando la diferencia post_start y pre_start, podemos
* comprobar si algún evento asincrónico ocurrió o no
*/

loops_per_jiffy se utiliza para implementar las funciones udelay (retraso en microsegundos) y ndelay (retraso en nanosegundos). Algunos controladores necesitan estas funciones para esperar el hardware. Tenga en cuenta que se usa una técnica de espera ocupada, por lo que el núcleo se bloquea de manera efectiva al ejecutar las funciones ndelay/udelay. Para la arquitectura i386, delay_loop se implementa en /usr/src/linux/arch/i386/lib/delay.c como:

/* simple retraso basado en lazo: */estática vacío delay_loop()no firmado largo bucles){} int ; __asm__ __volatile__() "tjmp 1fn" "Align 16n" "1:tjmp 2fn" "Align 16n" "2:tdecl %0ntJns 2b :"= ()) :"0" ()bucles));}

equivalente al siguiente código ensamblador

; entrada: eax = d0; salida: eax = 0 jmp Empieza. Align 16empezar: jmp cuerpo. Align 16cuerpo: decl eax jns cuerpo

que se puede reescribir en pseudocódigo C

estática vacío delay_loop()largo bucles){} largo  = bucles; do {} --; } mientras () >= 0);}

Puede encontrar información y detalles completos y completos sobre BogoMips, y cientos de entradas de referencia en el mini-Howto (desactualizado) de BogoMips.

Retrasos basados en temporizador

En 2012, ARM contribuyó con una nueva implementación de udelay que permite usar el temporizador del sistema integrado en muchas CPU ARMv7 en lugar de un ciclo de espera ocupado. Esta implementación se lanzó en la versión 3.6 del kernel de Linux. Los retrasos basados en temporizadores son más sólidos en los sistemas que utilizan el escalado de frecuencia para ajustar dinámicamente la velocidad del procesador en tiempo de ejecución, ya que los valores de loops_per_jiffies pueden no escalar necesariamente de forma lineal. Además, dado que la frecuencia del temporizador se conoce de antemano, no se necesita calibración en el momento del arranque.

Un efecto secundario de este cambio es que el valor de BogoMIPS reflejará la frecuencia del temporizador, no la frecuencia central de la CPU. Por lo general, la frecuencia del temporizador es mucho más baja que la frecuencia máxima del procesador, y algunos usuarios pueden sorprenderse al ver un valor BogoMIPS inusualmente bajo al compararlos con sistemas que usan bucles de espera ocupados tradicionales.