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