Copiar un objeto al dispositivo?

¿Puedo copiar un objeto C ++ al dispositivo?

decir que tengo:

class CudaClass { public: int* data; CudaClass(int x) { data = new int[1]; data[0] = x; } }; __global__ void useClass(CudaClass cudaClass) { printf("%d" cudaClass.data[0]); }; int main() { CudaClass c(1); } 

Ahora, ¿cómo copio “c” en la memoria del dispositivo e inicio kernel “useClass”?

Sí, puede copiar un objeto en el dispositivo para usarlo en el dispositivo. Cuando el objeto tiene punteros incrustados en regiones asignadas dinámicamente, el proceso requiere algunos pasos adicionales.

Vea mi respuesta aquí para una discusión de lo que está involucrado. Esa respuesta también tiene algunas respuestas de código de muestras vinculadas a ella.

Además, en la definición de su clase, si desea que ciertas funciones se puedan usar en el dispositivo, debe decorar esas funciones de manera apropiada (es decir, probablemente con __device__ __host__ );

EDITAR: En respuesta a una pregunta (ahora eliminada), aquí está el código de muestra más simple que pude obtener en función del código proporcionado:

 #include  class CudaClass { public: int* data; CudaClass(int x) { data = new int[1]; data[0] = x; } }; __global__ void useClass(CudaClass *cudaClass) { printf("%d\n", cudaClass->data[0]); }; int main() { CudaClass c(1); // create class storage on device and copy top level class CudaClass *d_c; cudaMalloc((void **)&d_c, sizeof(CudaClass)); cudaMemcpy(d_c, &c, sizeof(CudaClass), cudaMemcpyHostToDevice); // make an allocated region on device for use by pointer in class int *hostdata; cudaMalloc((void **)&hostdata, sizeof(int)); cudaMemcpy(hostdata, c.data, sizeof(int), cudaMemcpyHostToDevice); // copy pointer to allocated device storage to device class cudaMemcpy(&(d_c->data), &hostdata, sizeof(int *), cudaMemcpyHostToDevice); useClass<<<1,1>>>(d_c); cudaDeviceSynchronize(); return 0; } 

En aras de la brevedad / claridad he prescindido de la comprobación habitual de error de cuda.

Respondiendo a la pregunta, no puede asignar almacenamiento directamente desde el host usando el puntero en la clase basada en dispositivo. Esto se debe a que cudaMalloc espera un almacenamiento de puntero basado en el host ordinario, como lo que obtiene con:

 int *hostdata; 

cudaMalloc no puede funcionar con un puntero cuyo almacenamiento ya esté en el dispositivo. Esto no funcionará:

 cudaMalloc(&(d_c->data), sizeof(int)); 

porque requiere desreferenciar un puntero del dispositivo (d_c) en el código de host, que no está permitido.