gpt4 book ai didi

pointers - 复制包含指向 CUDA 设备的指针的结构

转载 作者:行者123 更新时间:2023-12-03 10:28:39 28 4
gpt4 key购买 nike

我正在做一个项目,我需要我的 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;
}

我的问题是: 这是这样做的方法吗?

看起来工作量很大,我提醒你这是一个非常简单的结构。如果我的结构体包含很多指针或自身带有指针的结构体,分配和复制的代码将非常庞大和困惑。

最佳答案

编辑: CUDA 6 引入了统一内存,这使得这个“深拷贝”问题变得容易了很多。见 this post更多细节。

不要忘记您可以按值将结构传递给内核。此代码有效:

// pass struct by value (may not be efficient for complex structures)
__global__ void kernel2(StructA in)
{
in.arr[threadIdx.x] *= 2;
}

这样做意味着您只需将数组复制到设备,而不是结构:
int h_arr[N] = {1,2,3,4,5,6,7,8,9,10};
StructA h_a;
int *d_arr;

// 1. Allocate device array.
cudaMalloc((void**) &(d_arr), sizeof(int)*N);

// 2. Copy array contents from host to device.
cudaMemcpy(d_arr, h_arr, sizeof(int)*N, cudaMemcpyHostToDevice);

// 3. Point to device pointer in host struct.
h_a.arr = d_arr;

// 4. Call kernel with host struct as argument
kernel2<<<N,1>>>(h_a);

// 5. Copy pointer from device to host.
cudaMemcpy(h_arr, d_arr, sizeof(int)*N, cudaMemcpyDeviceToHost);

// 6. Point to host pointer in host struct
// (or do something else with it if this is not needed)
h_a.arr = h_arr;

关于pointers - 复制包含指向 CUDA 设备的指针的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9309195/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com