Копирование структуры, содержащей указатели, на устройство CUDA

Я работаю над проектом, в котором мне нужно мое устройство CUDA для вычислений в структуре, содержащей указатели.

typedef struct StructA {
    int* arr;
} StructA;

Когда я выделяю память для структуры, а затем копирую ее на устройство, она копирует только структуру, но не содержимое указателя.Прямо сейчас я работаю над этим, сначала выделяя указатель, а затем настраивая структуру хоста на использование этого нового указателя (который находится на графическом процессоре). В следующем примере кода описывается этот подход с использованием структуры, приведенной выше:

#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<<<N,1>>>(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;
}

Мой вопрос: Это способ сделать это?

Это похоже на очень много работы, и я напоминаю вам, что это очень простая структура. Если моя структура содержала много указателей или структур с самими указателями, код для выделения и копирования будет довольно обширным и запутанным.

26
задан Swaroop 31 August 2015 в 03:46
поделиться