Avanti Indietro Indice

2. Frequenti domande riguardo i BogoMips

Svariati autori hanno contribuito alla mia conoscenza dei BogoMips, e in primo luogo desidero ringraziarli sentitamente.

2.1 Cosa sono i BogoMips

Citato da Internet, di fonte oscura ma portato all'attenzione dell'autore da Eric S. Raymond esr@thyrsus.com e da Geoff Mackenzie freon@dialstart.net, esiste una divertente definizione dei BogoMips come "il numero di milioni di volte per secondo in cui un processore può non fare assolutamente nulla".

Più seriamente, da un'email di Lars Wirzenius wirzeniu@kruuna.Helsinki.FI datata 9 settembre 1993, in cui egli illustra l'argomento, ed estesa con dettagliate informazioni aggiuntive fornite da Alessandro Rubini rubini@morgana.systemy.it e da Wim van Dorst, si ha il seguente stralcio

"MIPS è una abbreviazione per Millions of Instructions Per Second, ed è una misura della velocità computazionale di un programma. Come la maggior parte delle misure di questo tipo, è più spesso abusata che usata in modo appropriato (è molto difficile confrontare a ragione MIPS per diversi tipi di computer).

I BogoMips sono un'invenzione di Linus. Il kernel (o forse si trattava di un device driver?) ha bisogno di un loop di temporizzazione (il tempo è troppo breve e/o è necessaria una precisione troppo alta per poter impiegare un metodo diverso dal busy-loop) che deve essere calibrato per la velocità del processore della macchina. Perciò, il kernel misura al momento del boot quanto velocemente un certo tipo di busy loop vada sul computer in questione. "Bogo" viene da "bogus", ovvero qualcosa di fasullo. Per cui, il valore dei BogoMips dà una qualche indicazione della velocità del processore, ma è davvero troppo poco scientifica per avere un nome diverso da BogoMips.

Le ragioni (ce ne sono due) per cui il numero di BogoMips è stampato durante il bootup è che a) aiuta un pochino il debugging e a controllare che la cache dei computer e il bottone del turbo funzionino, e che b) Linus ama ridacchiare quando vede della gente confusa sui newsgroup."

I BogoMips vengono misurati in /usr/src/linux/init/main.c (un semplice algoritmo in C, con un bell'esempio di aritmetica floating point in un kernel completamente ad interi) e la corrispondente variabile del kernel loops_per_sec è usata in diversi driver per scopi più seri. L'effettiva funzione di delay udelay() è scritta in assembler e di conseguenza ogni port del kernel ha la sua implementazione nel file /include/asm/delay.h. La variabile loops_per_sec e la funzione udelay() vengono usate in diversi driver, come può essere verificato con il codice seguente:

cd /usr/src/linux #o dove si trovino i sorgenti
find . -name '*.[hcS]' -exec fgrep loops_per_sec {} /dev/null \;
find . -name '*.[hcS]' -exec fgrep udelay {} /dev/null \;

Il loop di calcolo dei BogoMips per CPU non-Intel è simile ma non esattamente lo stesso, essendo per necessità di cose programmato in un altro linguaggio assembler. La misura dei BogoMips è tuttavia l'unica maniera portabile tra le varie piattaforme Intel e non per ottenere un'indicazione della velocità del processore. Persino la velocità di clock non è disponibile su tutte le CPU.

2.2 Come stimare quale dovrebbe essere il numero di BogoMips

Grazie a un'iniziativa di Ian Jackson ijackson@nyx.cs.du.edu e Przemek Klosowski, successivamente estesa ed ampliata dall'autore per processori odierni, è disponibile la seguente guida per l'approssimazione del numero di BogoMips:

Processore                  BogoMips           Confronto
Intel 8088                  clock * 0.004         0.02
Intel/AMD 386SX             clock * 0.14          0.8
Intel/AMD 386DX             clock * 0.18          1 (per definizione)
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

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 Duron/Athlon XP         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                dati al momento insufficienti
IBM S390                    dati al momento insufficienti
Intel ARM                   dati al momento insufficienti

Si noti che il ciclo che calcola il numero di BogoMips non sfrutta appieno il parallelismo di svariati processori, come ad esempio quello dell'Intel Pentium e dell'Alpha 21164. Si faccia anche riferimento al paragrafo "Un nuovo algoritmo di misurazione?", dal momento che, per alcuni di questi processori, kernel rilasciati recentemente possono produrrre valori differenti.

2.3 Come determinare il numero di BogoMips secondo la valutazionec corrente

Vi sono tre metodi per determinare il numero di BogoMips secondo l'algoritmo corrente, vale a dire:

  1. guardare in /proc/cpuinfo, ad esempio con il comando cat /proc/cpuinfo. Questo è il metodo preferito.
  2. guardare nell'output di syslog per vedere che cosa è stato stampato là durante il boot. Se siete fortunati tale informazione può essere ancora sulla console virtuale usata durante il boot (se necessario, portatevi su detta console con la combinazione di tasti Alt-F1), altrimenti può essere recuperata esplicitamente con i comandi dmesg o syslogk. Questa alternativa produce sempre risultati accurati ma richiede più sforzo di qualla summenzionata.
  3. usando il programma bogomips. Questa opzione è raccomandata solo per sistemi non Linux, per ragioni che saranno menzionate di seguito.

Un'alternativa, che produce risultati non determinativi ma può essere anche usata su sistemi non Linux come ad esempio i Cray, può essere un programma indipendente di misurazione dei BogoMips. Una versione recente (correntemente alla release 1.4) è attualmente disponibile presso Darrick Wong djwong@thibs.menloschool.org. Jeff Tranter jeff_tranter@mitel.com ne fu invece l'autore originale. Citiamo dal suo file readme:

"Stufi di riavviare il vostro sistema solo per vedere a quanti BogoMips sta girando oggi? [...] "Bogomips" è un programma indipendente che misura la performance del vostro sistema usando uno di benchmark più riconosciuti al mondo. Usa lo stesso codice usato dal kernel Linux all'avvio, ma lo esegue come un'applicazione. [...] La versione 1.3 di BogoMips è portabile e dovrebbe essere utilizzabile su qualunque sistema dotato di un compilatore C e libreria ANSI standard."

Si noti che a causa del carico del sistema i valori misurati con tale programma potrebbero risultare più bassi di quanto registrato nell'elenco incluso in questo documento. Un programma standalone non può intrinsecamente dare gli stessi risultati della sequenza di boot, poiché il carico di sistema sarà in competizione con il programma lanciato dall'utente. Conseguentemente sono sottoelencate solo valutazioni di BogoMips originate da sequenze di boot.

Si tenga presente che il file di Jeff sunsite.unc.edu:/pub/Linux/system/status/bogo-1.2.tar.gz/ contiene una versione oramai superata. Si usi invece il programma di Darrick reperibile al seguente URL: http://thibs.menloschool.org/~djwong/programs/bogomips/, ove si può persino reperire un eseguibile per MSW*nd*ows.

2.4 Variazioni nella valutazione dei BogoMips

Da un posting di Linus Torvalds torvalds@cc.helsinki.fi del 28 aprile 1994 in comp.os.linux.development, riguardante le variazioni che è possibile osservare nei BogoMips misurati:

"Il ciclo di calcolo dei BogoMips è quantizzato e di conseguenza si otterrà lo stesso valore il più delle volte. Solitamente, si otterranno variazioni nei valori misurati solo quando il valore misurato è al limite e piccole variazioni (ad esempio nel timing degli interrupt) può causare il salto da un valore all'altro."

Se un kernel non è compilato specificamente per la CPU in questione, si possono anche avere delle variazioni (perfino rilevanti) della valutazione dei BogoMips, principalmente a causa di allineamenti non ottimali. Questo problema sembra verificarsi solo su alcune CPU x86 (Intel e cloni). Fortunatamente può essere facilmente aggirato ricompilando il kernel specificamente per la CPU del sistema.

2.5 Un nuovo algoritmo di misurazione?

L'algoritmo di misurazione dei BogoMips, contrariamente alla credenza popolare, NON è cambiato nelle varie versioni del kernel. Inoltre, è intrinsecamente lo stesso per tutti i processori di tutte le marche.

Ciò che è cambiato nel kernel 2.2.14 è lo stato della CPU giusto prima della misura dei BogoMips. Questo influenza i BogoMips misurati su tutte le CPU Intel e AMD di classe Pentium, risultando in approssimativamente 2*clock BogoMips, il che non era il caso in precedenza.

Le misure ottenute con queste nuove versioni del kernel su CPU dove questo cambiamento è rilevante (Pentium II/III, Celeron, Athlon) sono indicate nella lista seguente con un asterisco (*) iniziale.

2.6 BogoMips ... failed

Sezione originata da varie domande poste in rete e da scambi di e-mail privati tra cui quello con Lily, lbliao@alumni.caltech.edu, e con Pierre Frenkiel, frenkiel@cdfap2.in2p3.fr. Nel marzo del 1995 si chiedevano:

"Quando avvio Linux ricevo il seguente messaggio:
      Calibrating delay loop.. ok - 23.96 BogoMips
      failed
Dove e perché il mio ciclo di calibrazione è fallito?"

Effettivamente, il ciclo di calibrazione non è fallito. Se il ciclo di calibrazione fosse fallito il messaggio sarebbe invece stato:

      Calibrating delay loop.. failed

Molto probabilmente è stata l'inizializzazione di un qualche driver per un dispositivo che non è installato nel sistema in questione ad aver fallito. Immediatamente dopo il calcolo dei BogoMips vengono inizializzati tutti i device driver. Per primi i dispositivi su controller SCSI, poi i dispositivi di rete e così via. Qualsiasi errore è appropriatamente riferito. Degno di nota è il driver AHA152x. Altri effetti della mancata inizializzazione di un driver (e non del mancato calcolo del numero di BogoMips) sono crash del sistema, lunghe attese o completa paralisi del sistema in prossimità dell'output (immediatamente prima o immediatamente dopo) della fatidica linea di testo "ok - xx.xx BogoMips".

A partire dal kernel 1.2 molti messaggi di errore sono stati migliorati, per cui si suggerisce di aggiornare il kernel almeno fino a quella versione per scoprire quale particolare driver è quello che fallisce. Un altro suggerimento è quello di ricompilare il kernel affinché siano inclusi solamente i driver necessari alla vostra configurazione di sistema.

2.7 Riguardo i processori clone (Cyrix, NexGen, AMD, ecc.)

Le CPU Cyrix tipo 486 hanno bisogno di software che attivi la memoria cache, talvolta chiamato anche software BogoBoost. Similmente, le CPU Cyrix 5x86 e 6x86 possono originare valori BogoMips drasticamente migliori se l'opzione BIOS di branch-prediction è stata attivata. Si noti tuttavia che il miglioramento delle performance potrebbe anche essere irrisorio. Ci sono parecchi pacchetti disponibili per calibrare le CPU Cyrix, come le patch bogoboost, cx5x86mod e set6x86, tutti reperibili dagli archivi ufficiali. È stato riferito che le CPU Cyrix 6x86 possono dare performance migliori quando il kernel è compilato con ottimizzazione per 486, invece che con ottimizzazione Pentium.

Le CPU NexGen 386-enhanced, marcate come Nx586, sono elencate come simili ai 386, poiché il fatto che abbiano performance simili a quelle di macchine di classe Pentium non è rilevante ai fini dei loro valori BogoMips.

Gli AMD 5x86, indicati anche come AMD 486DX5, sono macchine 486/33 quadruplicate del tutto in linea con le altre CPU 486. L'AMD K5 e il K6 sono CPU di classe Pentium ma hanno i loro propri moltiplicatori BogoMips.

2.8 Perché fare attenzione ai BogoMips

Lasciatemi aggiungere che ci sono solo due ragioni per prestare attenzione alla valutazione dei BogoMips che viene presentata al momento del boot di Linux:

  1. Per vedere se è nel giusto range per il particolare processore, la sua frequenza di clock e la cache potenzialmente presente. Molte CPU sono prone ai seguenti errori di configurazione
  2. Per vedere se il tuo sistema è più veloce del mio. Naturalmente questo è completamente sbagliato, inaffidabile, mal fondato e completamente inutile, ma tutti i benchmark soffrono di questo identico problema. Per cui, perché non usarlo? Questa stupidità inerente non ha mai fermato la gente dall'usare i banchmark, non è vero? :-)

Si noti che usi più seri di benchmark veri sono illustrati nel Linux Benchmarking Howto di André D. Balsa.


Avanti Indietro Indice