我在Cuda中有以下代码(它不是完整的代码)。 我试图检查它是否正确地从主机到设备复制数组 设备托管。
flVector初始化时带有一些数字和凹陷。
pass函数需要将flVector和indeces复制到设备内存中。 总的来说,在我调用传递函数之后,我尝试再次复制数组,但现在从设备复制到主机,然后打印值以检查值是否正确。
flat_h正确返回且值正确,但indeces返回垃圾值,我不知道代码有什么问题。
从pass函数返回两个变量我使用return命令返回flOnDevice,并且我还传入一个指向inOnDevice的指针来保存这个数组。 这两个变量在设备端,然后我试图将它们复制回主机。 这只是一个检查,看看一切都正常..但是当我打印inOnDevice我得到垃圾值。为什么?
int* pass(vector<int>& 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");
}
答案 0 :(得分:2)
这不符合您的想法:
int* pass(vector<int>& flVector, int* indeces, int inSize, int* inOnDevice)
{
...
cudaMalloc((void**) &(inOnDevice), sizeof(int) * inSize);
当您以这种方式将指针传递给函数时,您将通过值传递指针。
如果然后在函数内部获取该指针传递值的地址,则该地址与函数调用上下文中的任何内容都没有连接。在函数pass
内部,有*inOnDevice
的本地副本,您正在使用随后的cudaMalloc
修改本地副本操作
相反,您需要在这种情况下传递指向指针(模拟传递引用)或者通过引用传递。对于指向指针的示例,它看起来像这样:
int* pass(vector<int>& flVector, int* indeces, int inSize, int** inOnDevice)
{
...
cudaMalloc((void**) inOnDevice, sizeof(int) * inSize);
cudaMemcpy(*inOnDevice, indeces, inSize*sizeof(int), cudaMemcpyHostToDevice);
在main
:
flOnDevice = pass(flVector, indeces, indSize, &inOnDevice);
我认为如果您使用proper cuda error checking作为suggested to you before,您会看到从此行代码返回的错误:
cudaMemcpy(inde_h,inOnDevice,inSize*sizeof(int),cudaMemcpyDeviceToHost);