Svariati autori hanno contribuito alla mia conoscenza dei BogoMips, e in primo luogo desidero ringraziarli sentitamente.
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.
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.
Vi sono tre metodi per determinare il numero di BogoMips secondo l'algoritmo corrente, vale a dire:
/proc/cpuinfo
, ad esempio con il comando
cat /proc/cpuinfo
. Questo è il metodo preferito.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.
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.
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.
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 failedDove 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.
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.
Lasciatemi aggiungere che ci sono solo due ragioni per prestare attenzione alla valutazione dei BogoMips che viene presentata al momento del boot di Linux:
Si noti che usi più seri di benchmark veri sono illustrati nel Linux Benchmarking Howto di André D. Balsa.