我在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