首页 > 解决方案 > 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;

标签: c++memorycuda

解决方案


只需摆脱导致段错误的线路。后面的行正确地执行了您想要的操作。段错误的出现是由于 this:this->dev_B->info需要取消引用主机代码中的设备指针(非法)而 this:dev_data不需要。另请注意,您可能想像以前那样host_B->info.size()乘以sizeof(int)cudaMalloc

这是一个例子。您发布的代码无法编译,它有许多编译错误(在 中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("%d\n",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
$

推荐阅读