
                             BenchWork
                             *********

Premessa
========

La mediocrita' della stampa e della pubblicita' nel settore informatico
hanno finito per convincere l'utente medio che la velocita' di un computer
si possa misurare con la stessa disinvoltura con cui si misura la velocita'
di un'automobile. Qualcuno crede persino che questa velocita' si misuri in 
MHz. Gli utenti appena piu' smaliziati ricorrono alle piu' svariate unita'
di misura, come i MIPS, gli SpecINT, i WinMarks (!), etc. Peggio ancora 
sono coloro che tentano di misurare le prestazioni dei computer con le
"applicazioni reali", e che sparano numeri privi di senso senza
accorgersi che i risultati variano paurosamente praticamente ad ogni
riavvio del computer.

I fisici, che da sempre hanno a che fare con l'arte della misurazione,
sanno bene che ogni misura ha senso soltanto se sono stabilite con
esattezza le condizioni in cui e' stata fatta e che il risultato e' un
numero che deve sempre essere interpretato con attenzione.

Stabilire la velocita' di un computer non e' dunque un affare da poco.
Prima di tutto bisognerebbe chiarire cosa si intende per velocita'.
Misurare il tempo richiesto per eseguire un particolare programma e' in
genere il metodo utilizzato per trovare un numero che possiamo chiamare
genericamente "velocita'", ma che in realta' ha senso soltanto se e'
chiaro che cosa sta facendo il programma in questione.

Percio' si puo' dire che non esiste (e non esistera' mai) un metodo
universale per stabilire obiettivamente la velocita' "assoluta" di un
computer, in modo che sia possibile confrontare due computer qualsiasi
semplicemente confrontando due numeri. Lo stesso concetto e' totalmente
privo di senso, perche' ci sono talmente tanti parametri in gioco da
rendere impossibile un confronto diretto, in special modo tra
microprocessori e sistemi operativi diversi.


I Benchmark
===========

Quello che abbiamo cercato di fare con i nostri benchmark e' stabilire
la velocita' di alcuni punti chiave del sistema come l'accesso alla
memoria da parte della CPU, il calcolo intero e floating point e
perfino i decadimenti di prestazioni dovuti alla MMU.

Trattandosi di programmi scritti in C, i risultati di questi benchmark
dipendono in parte da quale compilatore si usa e da quali opzioni di
compilazione si attivano. Ove possibile, abbiamo cercato di eliminare
questa dipendenza, ma esiste sempre la possibilita' che l'uso di un
compilatore diverso produca risultati alterati. I risultati che
pubblichiamo sono stati ottenuti con eseguibli generati dal SAS/C 6.58
per i processori 68k, e dal SAS/C PPC beta 21 per le versioni PPC.
Abbiamo compilato i benchmark anche con il GCC 2.7.2.1 e con l'EGCS 2.01,
ottenendo risultati analoghi ma non identici. I benchmark sono facilmente
portabili anche su altri sistemi, e sono stati compilati con successo
anche per Linux/386, NetBSD-68k e Solaris (SPARC), dei quali non riportiamo
i risultati perche' ci e' mancato il tempo di eseguire test accurati sui
risultati.

I sorgenti che accompagnano questo articolo possono essere facilmente
compilati usando l'utility smake del SAS/C o make del GCC.


MandToPi
========

MandToPi e' un programma di calcolo puro, che trova il valore
approssimato di pi greco utilizzando una strana proprieta' dell'insieme
frattale di Mandelbrot. Non e' affatto un modo veloce di calcolare
pi greco, ma come benchmark resta comunque valido. Il ciclo piu'
interno del programma e' costituito principalmente da moltiplicazini
e somme di numeri in virgola mobile a 64bit (doppia precisione).
E' da notare che il PPC 604e produce risultati lievemente diversi
da quelli che si ottengono con una qualsiasi CPU 68k a causa della
minore precisione dell'unita' floating point comune a tutta la famiglia
PPC (64bit anziche' 80bit). Per i processori dotati di cache istruzioni,
i risultati di questo test sono del tutto slegati dalla velocita' di
accesso alla memoria per i processori dotati di cache. Abbiamo compilato
una version di MandToPi che utilizza la libreria matematica fornita dal
SAS/C al posto della FPU per le CPU che ne sono sprovviste. L'eseguibile
che ne e' risultato e' cosi' lento che abbiamo dovuto diminuire il
numero delle iterazioni di 100 circa volte per ottenere una velocita'
di esecuzione accettabile su 68040.


Sieve
=====

Sieve e' un programma che calcola numeri primi in un modo che non
richiede alcuna divisione o moltiplicazione, ma che consuma una
quantita' notevole di memoria. Il programma accede alla memoria in
modo non sequenziale, percio' il risultato e' influenzato sia dalle
dimensioni della cache, sia dalla velocita' di accesso alla memoria.
Questo benchmark imita il mix di calcolo intero e accesso alla meoria
tipico in molte applicazioni reali.


Matrix
======

Matrix e' disponibile in tre diverse versioni. Si tratta di un programma
che esegue calcoli matriciali su tre matrici di 500 righe per 500 colonne,
che occupano ciascuna 1MB di memoria. Il programma esiste in tre versioni
distinte: intero, floating point in singola precisione e floating point
in doppia precisione. L'accesso alla memoria in questo programma e'
semi-sequenziale, mentre i calcoli principalmente somme e prodotti.
Il confroto tra i risultati di queste tre versioni permette di ottenere
una stima della velocita' della CPU rispetto ai tre tidi di dati presi
in esame. Dalle nostre prove emerge che le FPU del 68040, 68060 e del
PPC 604e eseguono le operazioni floating point praticamente alla stessa
velocita' dei calcoli interi. La versione con i numeri in doppia
precisione invece e' piu' lenta a causa delle maggiori dimensioni delle
matrici (2MB anziche' 1MB).


MMUTest
=======

MMUTest e' forse il piu' singolare dei test che presentiamo. Anche se
non se ne parla spesso, l'efficienza della MMU ha un ruolo piuttosto
importante nella velocita' di esecuzione di alcuni algoritmi. La MMU
(Memory Management Unit) e' presente in tutti i microprocessori moderni
(nella famiglia 68k e' di serie dal 68030 in poi) e permette di
suddividere la memoria in pagine (tipicamente da 4KB ciascuna) alle quali
si puo' assegnare un indirizzo logico diverso da quello fisico e che
possono essere protette in lettura o in scrittura. La MMU e' utilizzata
per implementare la protezione della memoria e la memoria virtuale.
Anche se AmigaOS non utilizza nessuna di queste funzioni, la MMU e'
comunque attiva e funzionante nei sistemi con 68040 e 68060. Ogni volta
che si verifica un accesso in memoria, la MMU controlla una cache interna
per verificare se l'accesso e' legittimo ed eventualmente per tradurre
l'indirizzo logico in un indirizzo fisico diverso. Se il descrittore
della pagina richiesta non si trova nella cache, la MMU deve prelevarlo
dalla memoria, accedendo ad una struttura detta "tavola di traslazione",
che tipicamente e' strutturata come un albero a piu' livelli. Questa
operazione richiede un certo tempo e quindi di fatto rallenta l'esecuzione
dei programmi che accedono a grandi porzioni di memoria in modo molto
frammentario. Un esempio tipico sono i generatori di paesaggi voxel.
Nell'impressionante demo di Warp OS, e' stato usato un trucco che risolve
questo problema migliorando di oltre il 30% la velocita' globale del
programma. Rispetto a tutte le altre CPU, PPC603e ha in piu' lo svantaggio
di non essere in grado di prelevare autonomamente i descrittori dalla
memoria (deve chiamare una apposita routine di sistema) e quindi risulta
essere molto svantaggiato in questo test. La percentuale indicata
da MMUTest indica una stima del peggioramento di prestazioni che si
verifica tra accessi in memoria a pagine presenti nella cache della
MMU e accessi studiati in modo da costringere la MMU a caricare
continuamente nuovi descrittori dalla memoria. Lanciando questo test al
boot, prima di aver eseguito SetPatch (che di fatto attiva le cache e
le MMU del 68040/60), si nota come l'accesso sequenziale alla memoria
sia veloce quanto quello non sequenziale. In presenza della MMU, si nota
invece una notevole riduzione delle prestazioni nell'accesso non
sequenziale. Il test dovrebbe essere influenzato dalla versione della
68040.library, della 68060.library e della ppc.library. I risultati
potrebbero essere alterati anche dalla presenza di tool che modificano
le tabelle della MMU, quali Enforcer, VMM, Shapeshifter, Fusion, etc.



                                          Bernardo Innocenti
                                          bernie@shock.cosmos.it

                                          Massimo Santoro
                                          max-m-o@usa.net
 
