2011-11-28 18 views
8

Quando si richiama un kernel CUDA per una configurazione thread specifica, esistono regole rigide su in cui devono risiedere i parametri del kernel dello spazio di memoria (dispositivo/host) e quale tipo dovrebbero essere?Parametri ai kernel CUDA

Supponiamo lancio una griglia 1-D di fili con

kernel<<<numblocks, threadsperblock >>> (/*parameters*/) 

Posso passare un parametro intero int foo che è una variabile -integer ospitante, direttamente al kernel CUDA? O dovrei la memoria cudaMalloc per un singolo intero dire dev_foo e poi cudaMemcpyfoo in devfoo e quindi passare devfoo come parametro del kernel?

risposta

12

Le regole per gli argomenti del kernel sono una conseguenza logica delle regole di passaggio dei parametri C++ e del fatto che la memoria del dispositivo e dell'host sono fisicamente separate.

CUDA non consente di passare argomenti per riferimento e si deve fare attenzione con i puntatori.

In particolare, è necessario passare i parametri in base al valore. Il passaggio di tipi definiti dall'utente richiede che il costruttore di copia predefinito o il proprio costruttore di copia (se presente) non contenga allocazioni di memoria (allocazioni di heap con "nuovo" o "malloc").

Nel riepilogo pass-by-value funziona bene per interi, in virgola mobile o altri tipi primitivi e semplici strutture piatte definite dall'utente o oggetti di classe.

5

È necessario utilizzare solo cudaMalloc() e cudaMemcpy() per blocchi di dati. Non singolo int s e simili. È anche possibile passare struct s come parametri, purché non ci siano membri che puntano a un blocco di dati nella memoria dell'host.

Pertanto, come regola generale: se si passa un puntatore a un kernel, assicurarsi che punti nella memoria del dispositivo.

Problemi correlati