2013-02-11 7 views
8

Sto cercando di capire perché esiste cudaMemcpyFromSymbol(). Sembra che tutto quello che func 'symbol' può fare, i cmds nonSymbol possono fare.cudaMemcpy() vs cudaMemcpyFromSymbol()

Il simbolo func sembra facilitare la parte di un array o di un indice da spostare, ma ciò potrebbe essere eseguito con la funzione nonSymbol. Sospetto che l'approccio nonSymbol verrà eseguito più velocemente in quanto non è necessario alcun lookup di simboli. (Non è chiaro se il calcolo del simbolo cerca in fase di compilazione o di esecuzione.)

Perché dovrei utilizzare cudaMemcpyFromSymbol() rispetto a cudaMemcpy()?

+0

Penso che si possa solo copiare dalla memoria costante usando 'cudaMemcpyFromSymbol()' ma non sono sicuro. –

+2

@ Soroosh129 ... Può anche essere usato per copiare dalle variabili globali '__device__'. – sgarizvi

+0

@ sgar91 wow bello! Ce la puoi fare? –

risposta

9

cudaMemcpyFromSymbol è il modo canonico di copiare da qualsiasi staticamente variabile definita nella memoria del dispositivo.

cudaMemcpy non può essere utilizzato direttamente per copiare o da una variabile di dispositivo definita staticamente poiché richiede un puntatore di dispositivo e non è noto per ospitare il codice in fase di esecuzione. Pertanto, è necessaria una chiamata API che può interrogare la tabella dei simboli di contesto del dispositivo. Le due scelte sono, cudaMemcpyFromSymbol, che esegue la ricerca e la copia dei simboli in un'unica operazione oppure cudaGetSymbolAddress che restituisce un indirizzo che può essere passato a cudaMemcpy. Il primo è probabilmente più efficiente se si desidera eseguire solo una copia, quest'ultima se si desidera utilizzare l'indirizzo più volte nel codice host.

+2

Quando si definisce una variabile come '__device__', vengono definite due versioni della variabile. Uno su host e uno sul dispositivo. Prendendo l'indirizzo della variabile con '&' nel codice host, restituisce l'indirizzo della versione host. 'cudaGetSymbolAddress()' fornisce l'indirizzo della versione del dispositivo. Il decoratore '__device__' può essere utilizzato solo su variabili definite staticamente. –

+2

@RogerDahl: Probabilmente è meglio dire che * qualsiasi * simbolo del dispositivo definito staticamente (\ _ \ _ dispositivo \ _ \ _, \ _ \ _ costante \ _ \ _, persino trame) risulta nella toolchain che emette due * simboli *, uno nel modulo del dispositivo, l'altro nell'oggetto host. Il runtime CUDA imposta e mantiene una mappatura dinamica tra questi due simboli. Le chiamate API simbolo sono il modo di recuperare questa mappatura per i simboli \ _ \ _ costante \ _ \ _ e \ _ \ _ dispositivo \ _ \ _. Le API di texture recuperano la mappatura per i simboli delle texture, ecc. – talonmies

Problemi correlati