2011-11-28 28 views
8

Cuando se invoca un kernel CUDA para una configuración específica de subprocesos, ¿existen reglas estrictas en en las que los parámetros del núcleo de memoria (dispositivo/host) deberían residir y qué tipo deberían ser?Parámetros para núcleos CUDA

Supongamos que lanzar una rejilla de 1-D de hilos con

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

¿Puedo pasar un parámetro entero int foo que es una variable -integer anfitrión, directamente al kernel CUDA? ¿O debería cudaMalloc memoria para un solo entero decir dev_foo y luego cudaMemcpyfoo en devfoo y luego pasar devfoo como un parámetro de kernel?

Respuesta

12

Las reglas para los argumentos del kernel son una consecuencia lógica de las reglas de aprobación de parámetros de C++ y del hecho de que la memoria del dispositivo y del host están físicamente separadas.

CUDA no permite pasar argumentos por referencia y debe tener cuidado con los punteros.

Específicamente, debe pasar parámetros por valor. Pasar los tipos definidos por el usuario requiere que el constructor de copia predeterminado o su propio constructor de copia (si está presente) no contengan asignaciones de memoria (asignaciones de pila con "nuevo" o "malloc").

En resumen, pasar por valor funciona bien para integral, punto flotante u otros tipos primitivos, y simples estructuras planas definidas por el usuario u objetos de clase.

5

Solo necesita utilizar cudaMalloc() y cudaMemcpy() para bloques de datos. No solo int s y similares. También puede pasar struct s como parámetros, siempre que no tengan miembros apuntando a un bloque de datos en la memoria del host.

Como regla general: si está pasando un puntero a un kernel, asegúrese de que apunta a la memoria del dispositivo.