Copia di una struttura contenente puntatori al dispositivo CUDA

Sto lavorando a un progetto in cui ho bisogno del mio dispositivo CUDA per fare calcoli su una struttura contenente puntatori.

typedef struct StructA { int* arr; } StructA; 

Quando alloco memoria per la struct e poi la copio nel dispositivo, verrà solo copiata la struct e non il contenuto del puntatore. In questo momento sto lavorando a questo problema allocando prima il puntatore, quindi impostando la struttura dell’host in modo che utilizzi quel nuovo puntatore (che risiede sulla GPU). Il seguente esempio di codice descrive questo approccio usando la struct dall’alto:

 #define N 10 int main() { int h_arr[N] = {1,2,3,4,5,6,7,8,9,10}; StructA *h_a = (StructA*)malloc(sizeof(StructA)); StructA *d_a; int *d_arr; // 1. Allocate device struct. cudaMalloc((void**) &d_a, sizeof(StructA)); // 2. Allocate device pointer. cudaMalloc((void**) &(d_arr), sizeof(int)*N); // 3. Copy pointer content from host to device. cudaMemcpy(d_arr, h_arr, sizeof(int)*N, cudaMemcpyHostToDevice); // 4. Point to device pointer in host struct. h_a->arr = d_arr; // 5. Copy struct from host to device. cudaMemcpy(d_a, h_a, sizeof(StructA), cudaMemcpyHostToDevice); // 6. Call kernel. kernel<<>>(d_a); // 7. Copy struct from device to host. cudaMemcpy(h_a, d_a, sizeof(StructA), cudaMemcpyDeviceToHost); // 8. Copy pointer from device to host. cudaMemcpy(h_arr, d_arr, sizeof(int)*N, cudaMemcpyDeviceToHost); // 9. Point to host pointer in host struct. h_a->arr = h_arr; } 

La mia domanda è: è questo il modo di farlo?

Sembra un sacco di lavoro, e ti ricordo che questa è una struttura molto semplice. Se la mia struttura conteneva molti puntatori o strutture con gli stessi puntatori, il codice per l’allocazione e la copia sarà piuttosto esteso e confuso.