2012-03-30 2 views
12

Come il seguente errore implica, chiamare una funzione host ('rand') non è permesso nel kernel, e mi chiedo se c'è una soluzione per questo se ho bisogno di farlo.Come chiamare una funzione host in un kernel CUDA?

error: calling a host function("rand") from a __device__/__global__ function("xS_v1_cuda") is not allowed 

risposta

26

Purtroppo non è possibile chiamare le funzioni in dispositivi che non sono specificate con __device__ modificatore. Se avete bisogno di numeri casuali nel look codice del dispositivo al generatore casuale cuda curandhttp://developer.nvidia.com/curand

Se avete la propria funzione host che si desidera chiamare da un uso del kernel sia le __host__ e __device__ modificatori su di esso:

__host__ __device__ int add(int a, int b) 
{ 
    return a + b; 
} 

Quando questo file viene compilato dal driver del compilatore NVCC, vengono compilate due versioni delle funzioni: una richiamabile per codice host e un'altra chiamata per codice dispositivo. Ed è per questo che questa funzione può ora essere chiamata sia dal codice host che dal codice dispositivo.

+1

Quanto è grave il downgrade delle prestazioni nel chiamare una funzione host anziché utilizzare uno integrato CUDA? – Mattia

+0

Ciò implica che l'host e il dispositivo eseguiranno solo le rispettive copie delle funzioni? – avgvstvs

5

Mentre non applicabile ai 'rand()', ma alcune funzioni host come "printf" sono disponibili durante la compilazione con la compatibilità di calcolo> = 2.0

esempio:

nvcc.exe -gencode=arch=compute_10,code=\sm_10,compute_10\... 
error : calling a host function("printf") from a __device__/__global__ function("myKernel") is not allowed 

Compila e funziona con sm_20 , compute_20

7

La risposta breve è che qui non c'è soluzione a questo problema.

Tutto ciò che normalmente viene eseguito su una CPU deve essere adattato per un ambiente CUDA senza alcuna garanzia che sia persino possibile farlo. Le funzioni host sono solo un altro nome in CUDA per le normali funzioni C. Cioè, le funzioni in esecuzione su una CPU-memoria Von Neumann come l'architettura C/C++ è stata fino a questo punto nei PC. Le GPU offrono enormi quantità di potenza di calcolo, ma il costo è che non è altrettanto flessibile o compatibile. Soprattutto, le funzioni funzionano senza la possibilità di accedere alla memoria principale e la memoria a cui possono accedere è limitata.

Se quello che stai cercando di ottenere è un generatore di numeri casuali, sei fortunato considerando che Nvidia si è presa la briga di implementare specificamente un Mersenne Twister altamente efficiente in grado di supportare fino a 256 thread per SMP. È richiamabile all'interno di una funzione del dispositivo, descritta in un precedente post della mia here. Se qualcuno trova un link migliore che descriva questa funzionalità, rimuovi il mio e sostituisci il testo appropriato qui insieme al link.

Una cosa di cui sono continuamente sorpreso è il numero di programmatori che sembrano inconsapevoli di come sono generatori di numeri pseudo-casuali di alta qualità standardizzati. "Rolling your own" non è davvero una buona idea considerando quanti dei numeri pseudo-casuali dell'arte sono. Verifica di un generatore a fornire numeri accettabile imprevedibili prende un sacco di lavoro e il talento accademico ...

-1

Non sono d'accordo con alcune delle altre risposte nel senso seguente:

OP non descrive un problema : non è sfortunato che non si possano chiamare le funzioni __host__ dal codice del dispositivo - è del tutto impossibile che sia diversamente, e non è una cosa negativa.

Per spiegare: Pensare al codice host (CPU) come un CD che si inserisce in un lettore CD; e sul codice del dispositivo come una, per esempio, scheda SD che metti in un lettore musicale in miniatura.La domanda dell'OP è "come posso inserire un disco nel mio lettore musicale in miniatura"? Non puoi, e non ha senso volerlo. Potrebbe essere essenzialmente la stessa musica (codice con la stessa funzionalità, sebbene in genere il codice host e il codice dispositivo non eseguano lo stesso compito computazionale), ma i supporti non sono intercambiabili.