c++ - 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;
解决方案
只需摆脱导致段错误的线路。后面的行正确地执行了您想要的操作。段错误的出现是由于 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
$
推荐阅读
- jquery - 无法在 ui-dialog 中打开图像文件 - IE 11 中的问题
- c# - 属性设置方法无法正常工作 - 任何修复?
- docusignapi - Docusign 在不打开浏览器的情况下请求授权码
- python - Mypy 需要很长时间来验证 AWS CDK 代码库
- powershell - 如何列出特定计算机上的登录?
- c# - 如何在我们自己的记录器中从 .net WebHost 捕获日志?
- c++ - 缺少 VC_MFCSupport
- node.js - 在反应 js 中出现类似不可处理实体的错误
- pandas - pandas - 附加在第一列
- python - 如果窗口失去焦点,配置 `ttk.Syle().configure` 的效果会丢失