2011-12-24 3 views
5

sto facendo quanto segue:inizializzatore non consentito per __shared__ variabile per CUDA

__shared__ int exForBlockLessThanP = totalElementLessThanPivotEntireBlock[blockIdx.x]; 

dove totalElementLessThanPivotEntireBlock è una matrice su GPU. Il compilatore lancia come errore come indicato nel titolo della domanda. Non capisco davvero perché questo è un problema?

risposta

7

L'inizializzazione statica delle variabili condivise è illegale in CUDA. Il problema è che la semantica di come ogni thread dovrebbe trattare l'inizializzazione statica della memoria condivisa non è definita nel modello di programmazione. Quale thread dovrebbe scrivere? Cosa succede se il valore non è uniforme tra i thread? Come dovrebbe il compilatore emettere il codice per un caso del genere e come deve essere eseguito dall'hardware?

Nel tuo esempio nonsense, stai chiedendo a ogni thread nel blocco di inizializzare la stessa variabile condivisa con un valore - fondamentalmente una corsa di memoria staticamente compilata.

+1

SO, qual è il metodo giusto ??? – Programmer

+0

Nota. In quanto sopra, chiedo ad ogni thread nel blocco di assegnare exForBlockLessThanp allo stesso valore – Programmer

+0

Utilizzare un'istruzione condizionale per fare in modo che un thread esegua l'inizializzazione all'inizio del kernel – talonmies