2012-03-30 7 views
5

La memoria __shared__ in CUDA sembra richiedere una dimensione nota al momento della compilazione. Tuttavia, a mio problema, la dimensione della memoria __shared__ si conoscono solo in fase di esecuzione, cioèCome definire una memoria condivisa CUDA con una dimensione nota in fase di esecuzione?

int size=get_size(); 
__shared__ mem[size]; 

Questo finirà con "Errore: valore costante non è noto", e io non sono sicuro di come aggirare questo problema

+0

possibile duplicato del [l'allocazione della memoria condivisa] (http://stackoverflow.com/questions/5531247/allocating-shared-memory) – talonmies

risposta

5

Lo scopo della memoria condivisa è consentire ai thread in un blocco di collaborare. Quando si dichiara un array come __shared__, ogni thread nel blocco vede la stessa memoria, quindi non avrebbe senso che un determinato thread sia in grado di impostare le proprie dimensioni per un array nella memoria condivisa.

Tuttavia, è supportato il caso speciale di specificare dinamicamente la dimensione di un singolo array __shared__ con le stesse dimensioni per tutti i thread. Vedi allocating shared memory.

Se è necessario allocare dinamicamente la memoria per ogni thread, è possibile utilizzare new o malloc all'interno di un kernel (su Fermi), ma allocano la memoria globale, che è probabile che sia lenta.

+0

In realtà mi stava cercando di fare blockDim.x come la dimensione della memoria __shared__, che sarà lo stesso per tutti i thread nello stesso blocco, ma è comunque fallito (con un errore diverso) –

+0

@HailiangZhang: Non si può decidere di risolvere il problema variando dinamicamente le dimensioni del blocco. In genere, si ottengono le migliori prestazioni considerando attentamente l'utilizzo delle risorse del proprio kernel e impostando una dimensione di blocco fissa e ottimale basata su tale. Ad esempio utilizzando il foglio di calcolo CUDA Occupancy Calculator. Inoltre, le dimensioni dovrebbero moltiplicarsi fino a un multiplo della dimensione di curvatura per ottenere prestazioni ottimali. Regolerai le dimensioni della griglia solo in modo dinamico, per adattarle ai tuoi dati. –

+0

@RogerDahl: questa risposta non è corretta. È __can__ determinare la memoria condivisa del kernel dinamicamente in fase di esecuzione: questa è stata una caratteristica di CUDA sin dalla 1.0. Vedi [questa risposta] (http://stackoverflow.com/a/5531640/681865) per come. – talonmies