2013-02-28 7 views
5

Il mio programma CUDA è affetto da un accesso di memoria globale non coalescente. Sebbene il thread idx-th si occupi solo della cella [idx] -th di un array, ci sono molti accessi indiretti alla memoria, come mostrato di seguito.Accesso alla memoria globale non coalescente causato dall'accesso indiretto in CUDA

int idx=blockDim.x*blockIdx.x+threadIdx.x; 

.... = FF[m_front[m_fside[idx]]]; 

Per m_fisde [idx], abbiamo coalizzato accessi, ma ciò che realmente bisogno è FF [m_front [m_fside [idx]]]. C'è un accesso indiretto a due livelli.

Ho cercato di trovare alcuni pattern dei dati in m_front o m_fsied per fare in modo che questo fosse un accesso sequenziale diretto, ma ho scoperto che sono quasi "casuali".

C'è un modo possibile per affrontare questo?

+1

Questo è effettivamente lo stesso problema dell'indirizzamento a matrice sparsa e si è lavorato piuttosto molto sulla comprensione di come migliorarlo. Potresti avere qualche idea guardando la letteratura sulle operazioni con matrici sparse su GPUS. – talonmies

+0

Se c'è qualche località negli accessi, [questa domanda] (http://stackoverflow.com/questions/12938333/coalesced-global-memory-writes-using-hash/12938726#12938726) potrebbe essere di interesse. –

+1

@RobertCrovella ... Il collegamento ** Meccanismo texture ** fornito nella risposta collegata sopra, è scaduto. Puoi aggiornare il link? – sgarizvi

risposta

3

Accelerazione memoria ad accesso casuale globale: Invalidare la linea di cache L1

Fermi e Keplero architetture supportano due tipi di carichi da memoria globale. La memorizzazione nella cache completa è la modalità predefinita , tenta di colpire in L1, quindi in L2, quindi in GMEM e la granularità del carico è di 128 byte. L2-only tenta di colpire in L2, quindi GMEM e la granularità del carico è 32-byte. Per alcuni modelli di accesso casuale, l'efficienza della memoria può essere aumentata invalidando L1 e sfruttando la granularità inferiore di L2. Questo può essere fatto compilando con l'opzione –Xptxas –dlcm=cg su nvcc.

Linee guida generali per accelerare l'accesso di memoria globale: disabilitare il supporto ECC

Fermi e GPU Kepler supporto Error Correcting Code (ECC), ed ECC è abilitato di default. ECC riduce la larghezza di banda della memoria di picco ed è richiesto per migliorare l'integrità dei dati in applicazioni come l'imaging medico e il cluster computing su larga scala. Se non è necessario, è possibile disabilitare per migliorare le prestazioni utilizzando l'utilità nvidia-smi su Linux (vedere link) o tramite il Pannello di controllo sui sistemi Microsoft Windows. Si noti che attivare o disattivare ECC richiede un riavvio per avere effetto.

Linee guida generali per accelerare l'accesso memoria globale su Kepler: l'utilizzo di cache di sola lettura dei dati

Keplero dispone di una cache di 48KB per i dati che è noto per essere di sola lettura per la durata della funzione. L'utilizzo del percorso di sola lettura è utile perché consente di scaricare il percorso della cache Shared/L1 e supporta l'accesso alla memoria non allineata a velocità massima pari a . L'utilizzo del percorso di sola lettura può essere gestito automaticamente dal compilatore (utilizzare la parola chiave const __restrict) o esplicitamente (utilizzare lo standard __ldg()) dal programmatore .

+0

Grazie mille. Invalidare la linea L1 Cache ha senso per me. Proverò questo per vedere se l'efficienza di mem può essere aumentata. Inoltre, la cache dei dati di sola lettura di Kepler è anche un buon consiglio. Non ho abbastanza familiarità con le nuove caratteristiche di Keplero. Lasciami provare. Tuttavia, ho bisogno del supporto ECC. – thierry

Problemi correlati