2013-09-30 8 views
6

Ho sempre pensato che le divergenze ramo è causata solo dal codice ramificazione, come "se", "altro", "per", "switch", ecc, tuttavia ho letto un articolo di recente in cui si dice:In CUDA, gli accessi di memoria non coalescenti causano divergenze di diramazione?

" Si può chiaramente osservare che il numero di rami divergenti presi dai thread in ciascun primo algoritmo basato sull'esplorazione è almeno due volte più importante della strategia di esplorazione completa Questo è in genere il risultato di ulteriori accessi non coalizzati al memoria globale Quindi, tale divergenza nei thread porta a molti accessi di memoria che devono essere serializzati, aumentando il numero totale di istruzioni eseguite.

Si può osservare che il numero di serializzazioni di ordito per la versione che utilizza accessi non coalescenti è tra sette e sedici volte più importante rispetto alla sua controparte. Infatti, una divergenza dei thread causata da accessi non coalizzati porta a molti accessi di memoria che devono essere serializzati, aumentando le istruzioni da eseguire. "

Sembra che, secondo l'autore, accessi non coalizzati possono causare rami divergenti. E 'vero? La mia domanda è, quanti motivi esattamente ci sono per la divergenza ramo? Grazie in anticipo.

+1

Potete collegare al riferimento originale? – talonmies

+1

+1 Voglio davvero sapere come una strategia di accesso alla memoria sarebbe responsabile per le diramazioni divergenti. Si prega di aggiungere il riferimento. –

+1

Questa tesi dovrebbe essere il riferimento. I 2 paragraghes provengono rispettivamente da p80 e p107. http://mistic.heig-vd.ch/luong/thesis.pdf – kangshiyin

risposta

3

credo l'autore è chiaro sui concetti e/o terminologia.

i due concetti di divergenza e serializzazione sono strettamente correlati. divergenza provoca serializzazione, come i gruppi divergenti di fili in ordito devono essere eseguiti in serie Ma la serializzazione non causa divergenza, come il riferimento alla divergenza in particolare per i thread all'interno di un warp che esegue percorsi di codice diversi.

Altre cose che causano la serializzazione (ma non la divergenza) sono i conflitti bancari e le operazioni atomiche.

+1

Un altro esempio di serializzazione senza divergenza di diramazione sarebbe l'accesso non uniforme alla memoria __constant__. – njuffa

+0

Grazie per aver chiarito i due concetti. Quindi il pattern di accesso alla memoria non coalescente dell'algoritmo/codice non ha assolutamente nulla a che fare con la divergenza delle filiali, in particolare, con il risultato di "efficienza del ramo" ottenuto da NVIDIA Profiler? – Ben

+0

@ Ben: è corretto. I documenti di CUDA Profiler dicono: Efficienza del ramo = ({Branches} - {Diverged Branches})/{Branches} 'e' Diverged Branches = branches che sono stati valutati in modo diverso attraverso un warp' e 'Branches = istruzioni del ramo eseguite'. In altre parole, 'Efficienza del ramo 'si riferisce in modo specifico alle istruzioni del ramo in un ordito e conta i casi in cui divergono (alcuni vengono presi e altri non vengono presi). –