Cuda C++:设备上的Malloc类,并用来自主机的数据填充它



我的目标是从主机"填充"一个驻留在设备内存中的类。由于该类包含一个指向数据的指针,我的理解是,在分配该类本身之后,我需要单独为其分配空间,然后将设备类的指针更改为现在分配的指针。我试图根据这篇帖子来确定我的解决方案,在我看来,这篇帖子似乎正是我想要的,但我做错了什么,因此我希望得到帮助。

我有以下类和相关代码的设置:

class A {
public:
HostB host_B;
B *dev_B;
void moveBToGPU();
}
class HostB {
public:
vector<int> info;
}
class B {
public:
int *info;
}
void A::moveBToGPU() {
cudaMalloc(this->dev_B, sizeof(B));
int* dev_data;
cudaMalloc(&dev_data, sizeof(int) * host_B->info.size());
cudaMemcpy(&this->dev_B->info, &dev_data, sizeof(int *), cudaMemcpyHostToDevice); //Not sure if correct
//I would like to do the following, but that results in a segfault
cudaMemcpy(this->dev_B->info, host_B->info.data(), host_B->info.size(), cudaMemcpyHostToDevice);
//As expected, this works
cudaMemcpy(dev_data, host_B->info.data(), host_B->info.size(), cudaMemcpyHostToDevice;

只需去掉导致seg故障的行。它后面的行可以正确地执行您想要的操作。segfault的产生是因为this:this->dev_B->info需要取消引用主机代码中的设备指针(非法(,而this:dev_data不需要。还要注意,您可能希望像使用cudaMalloc一样,将host_B->info.size()乘以sizeof(int)

下面是一个例子。您发布的代码无法编译,它有许多编译错误(在moveBToGPU中(。我不会试图列出每一个编译错误。请研究以下更改示例:

$ cat t1676.cu
#include <cstdio>
#include <vector>
using namespace std;
class HostB {
public:
vector<int> info;
};
class B {
public:
int *info;
};
class A {
public:
HostB host_B;
B *dev_B;
void moveBToGPU();
};
__global__ void k(A a){
printf("%dn",a.dev_B->info[0]);
}
void A::moveBToGPU() {
cudaMalloc(&dev_B, sizeof(B));
int* dev_data;
cudaMalloc(&dev_data, sizeof(int) * host_B.info.size());
cudaMemcpy(&dev_B->info, &dev_data, sizeof(int *), cudaMemcpyHostToDevice); //Not sure if correct

//As expected, this works
cudaMemcpy(dev_data, host_B.info.data(), sizeof(int)*host_B.info.size(), cudaMemcpyHostToDevice);
}
int main(){
A a;
a.host_B.info.push_back(12);
a.moveBToGPU();
k<<<1,1>>>(a);
cudaDeviceSynchronize();
}
$ nvcc -o t1676 t1676.cu
$ cuda-memcheck ./t1676
========= CUDA-MEMCHECK
12
========= ERROR SUMMARY: 0 errors
$

最新更新