Benchmarking della potenza di elaborazione della CPU

4

A condizione che siano già disponibili molti strumenti per l'analisi comparativa dei computer, mi piacerebbe scrivere da solo, iniziando con la misurazione della potenza di elaborazione.

Mi piacerebbe scriverlo in C sotto Linux, ma sono possibili altre alternative linguistiche.

Ho pensato partendo da operazioni in virgola mobile al secondo, ma è solo un suggerimento.

Ho anche pensato che sarebbe stato corretto tenere traccia del numero di core, quantità di RAM e simili della CPU, per associare in modo più coerente i risultati all'architettura della CPU.

Come procederesti al compito di misurare la potenza di calcolo della CPU?

E oltre a questo: mi preoccuperei di un carico di lavoro minimo adeguato indotto dai servizi in esecuzione simultaneamente; è corretto eseguire il benchmarking come processo autonomo (e possibilmente evitato dal sistema operativo)?

    
posta Federico Zancan 02.04.2012 - 18:26
fonte

2 risposte

3

Avendo gareggiato nel benchmarking hardware (sai, l'overclocking dell'hardware e della macchina concorrente che calcola il Pi il tipo più veloce di roba) e ho scritto anche qualche codice di benchmarking, prima di tutto voglio dire che l'hardware di benchmarking è molto preciso soggetto complicato. È una miscela tra che vuoi confrontare, come vuoi fare un benchmark, dove vuoi fare un benchmark e soprattutto perché vuoi fare un punto di riferimento.

Lasciatemi discutere in dettaglio queste proprietà.

Cosa : Ci sono diversi tipi di cose da confrontare in ogni dato sistema. Si potrebbe voler fare un riferimento per esempio larghezza di banda di memoria o latenza. O disco rigido di scrittura / lettura latenza / larghezza di banda. O per esempio "CPU speed" in modo generico. Tuttavia, probabilmente non è così semplice, che mi porta al punto successivo ...

Come : Dato che ci sono cose diverse da confrontare, ci sono diversi modi di riferimento. Ad esempio, è possibile confrontare GFLOPS CPU / GPU con una semplice moltiplicazione di matrice naive. Questa operazione potrebbe o potrebbe non avere alcuna correlazione con capacità descrittive delle prestazioni comuni del componente hardware in questione. Una CPU che ha ottenuto buoni punteggi in un benchmark di moltiplicazione della matrice potrebbe non ottenere un punteggio altrettanto buono, ad esempio in un benchmark di compressione dei dati. Ci sono più variabili che hanno un impatto sul risultato e forse la più importante è la microarchitettura sottostante e quanto bene il codice in questione può prendere vantaggio dei suoi punti di forza ed evitare che sia debolezze . Quindi tutto si riduce a implementazione . Un singolo punto di riferimento è una singola implementazione dell'algoritmo utilizzato!

Dove : È una palla completamente diversa da giocare per eseguire benchmark in un ambiente virtuale come all'interno di una macchina virtuale, rispetto all'esecuzione come un processo all'interno di un sistema operativo multitasking, o rispetto all'esecuzione del codice come unica istanza su detta macchina (ovvero, senza OS o driver o watsoever nel modo in cui, avviando direttamente la macchina basata su x86 da un MBR personalizzato alla modalità reale e lavorando da lì.). Più la macchina di destinazione ha un codice "altro" in esecuzione in "background", meno affidabile sarà il risultato del benchmark. Quindi, eseguire un benchmark su un server con un carico elevato della CPU non produrrà risultati molto affidabili. Allo stesso modo, poiché sulla maggior parte dei sistemi operativi moderni il sistema operativo e il suo kernel forniscono uno strato di astrazione, le impostazioni e i parametri del kernel hanno un impatto sulle prestazioni dei processi. Ad esempio, le priorità di processo / thread e i parametri di pianificazione di processo / thread possono avere un impatto molto misurabile sui risultati del benchmark. Come regola generale, meno stai andando avanti sulla macchina, meglio è, quindi l'ambiente ideale sarebbe quello di dedicare il suddetto componente hardware esclusivamente allo scopo del benchmarking.

Perché : Qual è lo scopo del benchmark che tenta di riempire? Vuoi provare a dare qualcosa come un'indicazione teorica delle prestazioni per un dato pezzo di hardware nell'esecuzione di uno specifico algoritmo / insieme di algoritmi (senza dimenticare che un benchmark semplicemente stabilisce come l'implementazione di quel algoritmo )? O stai cercando di imitare il più fedelmente possibile la "performance del mondo reale" del suddetto componente hardware? Tutto dipende, perché ovviamente le prestazioni nella moltiplicazione delle matrici hanno poco a che fare con le prestazioni nel servire pagine web o query di database.

Naturalmente questi punti sono molto vaghi, ma quello che vorrei che le persone avessero in mente quando parlano di benchmark in termini di prestazioni hardware è che dipende , è semplicemente un indicatore ed è sempre caso specifico . C'è così tanto che puoi fare con la scrittura del codice fast che non è nemmeno divertente provare a parlare dei risultati dei benchmark (ad esempio un'implementazione molto su misura di qualche compito arbitrario che è ottimizzato per un certo set di istruzioni estensioni, una certa dimensione della cache, alcune penalità di errore di predizione del ramo, un certo livello di parallelismo del livello di istruzione e una certa latenza di accesso alla memoria) tra diversi tipi di CPU. È tutto su come cercare di sfruttare i vantaggi dell'hardware ed evitare i punti deboli.

tl; dr : è difficile farlo bene (se è anche possibile), vuoi conoscere alcuni concetti di basso livello dell'hardware di destinazione ed essere consapevole che tutto è caso specifico. Non può mai esistere un benchmark universale .

    
risposta data 03.04.2012 - 07:09
fonte
1

I benchmark utili confrontano il tempo per il lavoro effettivo rispetto ai problemi del mondo reale; ad es., transcodifica video, calcolo di formule matematiche complesse, modelli 3d in calo, ecc.

Mentre di norma i parametri di riferimento non misurano nulla di più importante della velocità con cui un sistema gestiva il benchmark, almeno in questi casi è possibile correlare il risultato a cose che potresti aver trovato per te stesso. Non è ancora perfetto, ma è meglio di un loop stretto di una singola funzione.

Ricorda inoltre che un singolo algoritmo può essere sintonizzato su un chip specifico. AMD e Intel, ad esempio, differiscono classicamente sul numero di unità logiche che dedicano alla matematica in virgola mobile rispetto all'intero. Quindi scrivere il codice per utilizzare l'uno o l'altro favorirà necessariamente una specifica famiglia di chip. Non c'è davvero modo di allontanarsi da questa realtà; non puoi assolutamente scrivere un benchmark neutrale .

Quindi, invece di scegliere i lati, molte suite di benchmark utilizzano semplicemente il software popolare esistente (ad esempio ffmpeg per la transcodifica video). L'idea è che sia il software che gli utenti eseguiranno comunque, quindi il benchmark dovrebbe riflettere l'esperienza attesa dell'utente con quel software. Questa è la teoria, almeno. Ma ovviamente, a seconda del software che scegli, continuerai a influenzare i risultati.

Inoltre, tieni presente che la maggior parte delle idee di benchmark zero-work che potresti creare (cicli stretti che eseguono una singola operazione) saranno spesso ottimizzate dal compilatore in qualcosa di completamente diverso da quello che hai previsto. Alcuni chip eseguiranno al volo simili ottimizzazioni, il che significa che finisci per misurare qualcosa di completamente diverso da quello che hai codificato . Ancora una volta, il miglior consiglio è il tempo in cui la macchina sta facendo qualcosa utile . Se il chip è in grado di ottimizzare quel codice, allora è esattamente quello che vuoi che il benchmark rifletta.

    
risposta data 03.04.2012 - 07:34
fonte

Leggi altre domande sui tag