Я работаю над проектом, где мне нужно, чтобы мое устройство CUDA выполняло вычисления на структуре, содержащей указатели.
typedef struct StructA {
int* arr;
} StructA;
Когда я выделяю память для структуры и затем копирую ее на устройство, онабудет копировать только структуру, а не содержимое указателя.Сейчас я работаю над этим, сначала выделив указатель, а затем установив структуру хоста для использования этого нового указателя (который находится на GPU).В следующем примере кода описывается этот подход с использованием приведенной выше структуры:
#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;
}
Мой вопрос: Это способ сделать это?
Кажется, чтоочень много работы, и я напоминаю вам, что это очень простая структура.Если моя структура содержит много указателей или структур с самими указателями, код для размещения и копирования будет довольно обширным и запутанным.