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?
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