2014-11-06 13 views
5

Sto cercando di analizzare un codice che ho trovato online e continuo a pensare a me stesso in un angolo. Sto guardando un kernel istogramma lanciato con i seguenti parametriCapire questo kernel CUDA lancia i parametri

histogram<<<2500, numBins, numBins * sizeof(unsigned int)>>>(...); 

So che i parametri siano griglia, blocco, dimensioni di memoria condivisa.

Questo significa che ci sono 2500 blocchi di thread numBins ciascuno, ogni blocco ha anche un blocco numBins * sizeof(unsigned int) di memoria condivisa disponibile per i suoi thread?

Inoltre, all'interno del kernel stesso ci sono chiamate a __syncthreads(), sono poi 2500 insiemi di numBins chiamate al __syncthreads() nel corso della chiamata kernel?

+2

Prima domanda: sì.Seconda domanda: i thread all'interno di quei 2500 blocchi, indipendenti dai thread in altri blocchi, raggiungeranno il punto '__syncthreads()', resteranno fino a quando tutti i thread nel blocco non termineranno il loro aggiornamento alla memoria condivisa fino a quel punto e arriveranno, e quindi continua ad eseguire ulteriori istruzioni. Tutti i thread all'interno del blocco dovranno vedere '__syncthreads()' così puoi dire che ci sono * 2500 serie di chiamate 'numBins' su' __syncthreads() '*, ma è diverso da una normale chiamata di funzione. È una routine di barriera per la sincronizzazione del thread intra-blocco. – Farzad

risposta

4

Quindi questo significa che ci sono 2500 blocchi di numBins filati ciascuna, ogni blocco avendo anche una numBins * sizeof (unsigned int) blocco di memoria condivisa disposizione dei suoi fili?

Dal CUDA Toolkit documentation:

La configurazione di esecuzione (di una chiamata di funzione globale) è specificata inserendo un'espressione della forma <<<Dg,Db,Ns,S>>>, dove:

  • Dg (DIM3) specifica la dimensione e la dimensione della griglia.
  • Db (DIM3) specifica la dimensione e la dimensione di ciascun blocco
  • Ns (size_t) specifica il numero di byte nella memoria condivisa viene allocata dinamicamente per blocco per questo invito Oltre alla memoria allocata staticamente.
  • S (cudaStream_t) specifica il flusso associata, è un parametro opzionale cui valore predefinito è 0.

Così, come @Fazar sottolineato, la risposta è sì. Questa memoria è allocata per blocco.

Inoltre, all'interno del kernel stesso ci sono chiamate a __syncthreads(), sono lì poi 2500 insiemi di numBins chiamate a __syncthreads() sul corso della chiamata kernel?

__syncthreads() attende fino a quando tutti i thread nel blocco di thread hanno raggiunto questo punto. Viene utilizzato per coordinare la comunicazione tra thread nello stesso blocco.

Quindi, c'è una chiamata __syncthread() per blocco.

Problemi correlati