2010-06-01 12 views
11

Voglio sapere se un programma che sto usando e che richiede molta memoria è limitato dalla larghezza di banda della memoria.Quando un programma è limitato dalla larghezza di banda della memoria?

Quando ti aspetti che ciò accada? Ti è mai successo in uno scenario reale?

ho trovato diversi articoli riguardanti questo problema, tra cui:

Il primo collegamento è un po 'vecchio, ma suggerisce che è necessario eseguire meno di circa 1-40 operazioni in virgola mobile per variabile in virgola mobile per vedere questo effetto (correggimi se ho torto).

Come posso misurare la larghezza di banda della memoria utilizzata da un determinato programma e come misurare la larghezza di banda (massima) che il mio sistema può offrire?

Non voglio discutere alcun problema di cache complicato qui. Mi interessa solo la comunicazione tra la CPU e la memoria.

+2

Sfortunatamente, non è possibile evitare di entrare in complicati problemi con la cache se si desidera una risposta alla propria domanda – erikkallen

+0

Hm, supponiamo di inizializzare l'intera memoria con 1.0s. Quindi moltiplico ogni elemento con un numero costante. E ripeti quel processo .. – hanno

+0

L'accesso a tutta la memoria ti farà limitare la larghezza di banda della memoria, a meno che l'intervallo tra gli elementi a cui si accede sia molto lungo. Che, da come sembra, non lo sarà. –

risposta

7

Per eseguire il benchmark delle prestazioni della memoria del sistema, provare lo STREAM benchmark. Studia le attività di benchmark ei risultati che ottieni con attenzione poiché forniscono i dati di base sulla tua memoria che devi fare di più. Devi capire l'effetto (o gli effetti) della (e) cache (i) - devi capirli - e quando la larghezza di banda raggiunge un picco.

di capire le prestazioni della memoria del vostro programma:

  1. misurare il tempo di esecuzione per una gamma di dimensioni del problema.
  2. Calcola, a mano, quanti dati il ​​tuo programma legge e scrive da e verso la memoria per lo stesso intervallo di dimensioni dei problemi.
  3. Dividere la memoria in base al tempo.

ATTENZIONE: questo è un approccio approssimativo e deve essere utilizzato solo per capire se è necessario prestare attenzione ai problemi di larghezza di banda della memoria. Se la tua rozza rappresentazione ti dice che il tuo programma usa meno del 50% della larghezza di banda della memoria disponibile (le cifre che hai ottenuto dal benchmark STREAM), allora non dovresti pensarci più.

Questo approccio approssimativo funziona meglio quando il programma gestisce relativamente poche strutture di dati molto grandi con schemi di accesso semplici. Questo descrive molti programmi scientifici ad alte prestazioni ma forse non molti altri tipi di programmi.

Se il programma utilizza la memoria virtuale o se esegue l'I/O durante l'esecuzione, la larghezza di banda della memoria non è un problema, non finché non si risolve la larghezza di banda del disco.

Infine, sì, ogni volta che eseguo uno dei nostri codici scientifici la velocità di esecuzione è limitata dalla larghezza di banda della memoria. Come regola generale, se un codice esegue il 10% dei FLOP che le specifiche del processore promettono sono felice.

+0

Grazie. Ci proverò ... – hanno

3

La portata ampia e generale della tua domanda rende quasi impossibile rispondere in un modo diverso dal più ampio senso.

È possibile aspettarsi che un programma sia associato alla CPU quando il numero di cicli della CPU richiesti per elaborare una riga della cache di dati in meno del numero di cicli della CPU richiesti per leggere una riga della cache e il set di dati elaborato è notevolmente maggiore di la cache dei dati della CPU. L'elaborazione delle immagini è un esempio in cui questo è spesso il caso.

Come posso misurare la larghezza di banda della memoria utilizzata da un determinato programma e come misurare la larghezza di banda (massima) che il mio sistema può offrire? Il primo può essere misurato (nel software) solo se la CPU supporta un tipo di contatore di prestazioni che conta il numero di cicli in cui la CPU è in stallo perché deve attendere il completamento di un accesso alla memoria.
Il secondo può essere facilmente misurato, in genere riempire/copiare ampie aree di memoria. Ci sono innumerevoli programmi di benchmark disponibili che puoi usare (non ne ho mai usato uno da anni, ma mi vengono in mente i numeri e PCMark. Ci dovrebbero essere molte utility freeware che fanno anche questo).

6

memoria applicazioni o applicazioni che richiedono molta memoria intensivi sono limitate da:

  1. velocità di RAM di fuori del processore
  2. Velocità di memoria cache all'interno del processore
  3. Numero di soggetti che condividono la memoria bus
  4. memoria virtuale

Purtroppo, thes Le limitazioni non sono i principali attori nelle prestazioni di un programma. Gli effetti più grandi sono: quantità di CPU, operazioni di I/O e altre attività in esecuzione con il programma. La modifica di questi elementi avrà un impatto maggiore sul programma rispetto alla modifica degli elementi che influiscono sulla larghezza di banda della memoria.

1. Velocità di RAM di fuori del processore
Il processore deve andare al di fuori delle sue istruzioni e dati guscio e afferrare dalla RAM. La RAM ha diverse velocità a cui può accedere alle celle e restituire i bit al processore. Generalmente, questo è segnato in unità di Hz. Più veloce è il tempo di memoria, minore è il tempo impiegato dal processo per caricare istruzioni e dati di caricamento e più veloce è l'esecuzione del programma.

Nota: L'aumento della velocità della memoria oltre le capacità del processore non aumenta le prestazioni. Cambia il collo di bottiglia dalla RAM al processore. Vedi anche # 3.

2. Velocità della cache all'interno del processore La memoria cache risiede all'interno della shell del processore. Questo è uno dei tipi più veloci di memoria disponibile. I processori cercheranno questa memoria prima di cercare la RAM. Migliorare la velocità e la quantità di questa memoria migliorerà le prestazioni del processore, a meno che altri core stiano accedendo a questa memoria. Per i core multipli che accedono alla memoria, è necessaria una risoluzione dei conflitti, che potrebbe rallentare le prestazioni delle applicazioni.

Nota: Non c'è nulla che tu possa fare per accelerare o modificare la dimensione della memoria cache tranne ottenere un altro processore. La cache non è qualcosa che può essere facilmente modificato da mani umane o robotiche.

3. Numero di soggetti che condividono il bus di memoria bus
La memoria è come una strada che le entità utilizzano per raggiungere la RAM. Come con un'autostrada, più corsie significano maggiore velocità (ad esempio larghezza di 16 bit rispetto a 32 bit). Molti bus hanno anche un limite di velocità, sempre più alto è il limite, più veloce è l'accesso. Probabilmente il concetto più importante è il numero di entità collegate al bus. Come per le autostrade, più utenti rallentano il traffico. Nella maggior parte dei bus di memoria, solo un'entità può usarlo alla volta; le altre entità devono aspettare. Riducendo il numero di entità che hanno bisogno di usare il bus di memoria accelera il tuo programma.

Alcune entità comuni condividono il bus di memoria: CPU, controller DMA, processori video, processori audio e processori di rete o I/O.

4. Memoria virtuale. Molti computer moderni utilizzano la memoria virtuale . Se il programma richiede più memoria di quella disponibile nella RAM, il sistema operativo scambierà sezioni di memoria con aree sul disco rigido. Ciò richiede più tempo di esecuzione rispetto alla riduzione della velocità operativa della memoria. Un programma ad alta intensità di memoria è più efficiente usando solo la memoria ad esso allocata rispetto a tutta la memoria di cui potrebbe aver bisogno. Ridurre questi swap di memoria virtuale velocizzerà un programma.


In breve, esiste una velocità massima a cui l'applicazione può essere eseguita. La memoria, sia la cache interna che la RAM esterna, contribuiscono al limite superiore. Ci sono fattori più grandi che impediscono alle applicazioni di raggiungere questo limite. Alcuni di questi fattori sono operazioni di I/O e altre attività simultanee. Anche la progettazione e l'implementazione di un programma possono contribuire alla lentezza. È possibile ottenere maggiori prestazioni eliminando le operazioni di I/O, le attività concorrenti e la riprogettazione del software piuttosto che modificando il limite superiore della velocità di accesso alla memoria. Cambiare questi limiti aumenterà le prestazioni del tuo programma, ma non così drastico come le altre tecniche.

+1

Questo è un buon riassunto, ma in realtà non risponde alla mia domanda: come posso misurare la larghezza di banda della memoria che un dato programma sta usando? – hanno

+0

Potrebbe essere possibile misurare la larghezza di banda utilizzando un debugger o un debugger JTAG collegato al processore. Altrimenti diventa difficile. Suggerisco di profilare le sezioni di codice che richiedono molta memoria. Un'altra idea è quella di mettere un analizzatore logico sul bus dati con una linea sui chip select della RAM. –

1

I programmi che sono limitati dalla larghezza di banda della memoria hanno riferimenti di memoria più elevati (operazioni di carico e/o di memorizzazione) alle operazioni aritmetiche/logiche. Esempio è routine BLAS1 come daxpy, ddot, ecc.

Se le routine di codice in alto (da un profilo piatto) hanno più operazioni aritmetiche da caricare/archiviare, non viene influenzato molto dalla larghezza di banda della memoria. L'esempio è la moltiplicazione matrice-matrice ottimizzata, LINPACK.

Problemi correlati