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?
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
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. –
@RobertCrovella ... Il collegamento ** Meccanismo texture ** fornito nella risposta collegata sopra, è scaduto. Puoi aggiornare il link? – sgarizvi