gpt4 book ai didi

arrays - 传递给 CUDA 的结构中的指针

转载 作者:行者123 更新时间:2023-12-02 02:24:57 26 4
gpt4 key购买 nike

我已经搞砸了一段时间了,但似乎无法做到正确。我正在尝试将包含数组的对象复制到 CUDA 设备内存中(然后再复制回来,但当我遇到它时我会跨过那座桥):

struct MyData {
float *data;
int dataLen;
}

void copyToGPU() {
// Create dummy objects to copy
int N = 10;
MyData *h_items = new MyData[N];
for (int i=0; i<N; i++) {
h_items[i].dataLen = 100;
h_items[i].data = new float[100];
}

// Copy objects to GPU
MyData *d_items;
int memSize = N * sizeof(MyData);
cudaMalloc((void**)&d_items, memSize);
cudaMemCpy(d_items, h_items, memSize, cudaMemcpyHostToDevice);

// Run the kernel
MyFunc<<<100,100>>>(d_items);
}

__global__
static void MyFunc(MyData *data) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
for (int i=0; i<data[idx].dataLen; i++) {
// Do something with data[idx].data[i]
}
}

当我调用 MyFunc(d_items) 时,我可以很好地访问 data[idx].dataLen 。但是,data[idx].data 尚未复制。

我无法使用 copyToGPU 中的 d_items.data 作为 cudaMalloc/cudaMemCpy 操作的目标,因为主机代码无法取消引用设备指针。

要做什么?

最佳答案

  • 为所有设备分配设备数据结构,作为单个数组。
  • 将连续数据从主机复制到GPU。
  • 调整 GPU 指针

示例:

float *d_data;
cudaMalloc((void**)&d_data, N*100*sizeof(float));
for (...) {
h_items[i].data = i*100 + d_data;
}

关于arrays - 传递给 CUDA 的结构中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3289554/

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