c cuda 指定gpu_c-Cuda分配并将数组从gpu返回到cpu

我在Cuda中有以下代码(不是完整的代码).

我正在尝试检查是否从主机到设备以及从主机正确复制了阵列

设备托管.

flVector使用一些数字和索引进行初始化.

传递函数需要复制flVector并将indes移至设备存储器.

总的来说,在调用pass函数之后,我试图再次将数组复制到设备上,但是现在又要从设备复制到主机上,然后打印值以检查值是否正确.

flat_h返回正确并且值正确,但是indeces返回带有垃圾值,并且我不知道代码有什么问题.

从传递函数返回两个变量,我使用了return命令返回flOnDevice,并且我还传递了一个指向inOnDevice的指针来保存此数组.

这两个变量在设备端,然后我试图将它们复制回主机.

这只是检查是否一切正常..但是当我打印inOnDevice时,我得到的是垃圾值.为什么?

int* pass(vector& flVector, int* indeces, int inSize, int* inOnDevice)

{

int* flOnDevice;

cudaMalloc((void**) &(flOnDevice), sizeof(int) * flVector.size());

cudaMemcpy(flOnDevice, &flVector[0], flVector.size()*sizeof(int),cudaMemcpyHostToDevice);

cudaMalloc((void**) &(inOnDevice), sizeof(int) * inSize);

cudaMemcpy(inOnDevice, indeces, inSize*sizeof(int), cudaMemcpyHostToDevice);

return flOnDevice;

}

void main()

{

int* insOnDevice = NULL;

int* flOnDevice;

flOnDevice = pass(flVector, indeces, indSize, inOnDevice);

int* flat_h = (int*)malloc(flVector.size()*sizeof(int));

int* inde_h = (int*)malloc(inSize*sizeof(int));

cudaMemcpy(flat_h,flOnDevice,flVector.size()*sizeof(int),cudaMemcpyDeviceToHost);

cudaMemcpy(inde_h,inOnDevice,inSize*sizeof(int),cudaMemcpyDeviceToHost);

printf("flat_h: \n\n");

for (int i =0; i < flVector.size(); i++)

printf("%d, " , flat_h[i]);

printf("\n\ninde_h: \n\n");

for (int i =0; i < inSize; i++)

printf("%d, " , inde_h[i]);

printf("\n\n");

}

解决方法:

这不是您想的那样:

int* pass(vector& flVector, int* indeces, int inSize, int* inOnDevice)

{

...

cudaMalloc((void**) &(inOnDevice), sizeof(int) * inSize);

以这种方式将指针传递给函数时,就是按值传递指针.

然后,如果您在函数内部获取该指针传递值的地址,则该地址与函数调用上下文中的任何内容都没有关系.在函数传递中,有* inOnDevice的本地副本,您正在使用后续的cudaMalloc操作修改该本地副本.

相反,您需要在这种情况下传递指针指向的指针(模拟按引用传递),否则按引用传递.对于指针到指针的示例,它看起来像这样:

int* pass(vector& flVector, int* indeces, int inSize, int** inOnDevice)

{

...

cudaMalloc((void**) inOnDevice, sizeof(int) * inSize);

cudaMemcpy(*inOnDevice, indeces, inSize*sizeof(int), cudaMemcpyHostToDevice);

而在主要方面:

flOnDevice = pass(flVector, indeces, indSize, &inOnDevice);

cudaMemcpy(inde_h,inOnDevice,inSize*sizeof(int),cudaMemcpyDeviceToHost);

标签:c-3,c,arrays,cuda

来源: https://codeday.me/bug/20191013/1908688.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值