我有一个带有指针的数据结构(想想链表)。在启动读取输入数据的内核之前无法确定其大小。因此,我在输入处理期间在设备上分配数据。
但是,尝试将该数据复制回主机失败。据我所知,这是因为 CUDA 存在限制,不允许运行时 API 访问设备分配的内存。然而,该信息适用于 CUDA 4“修复即将推出”。有谁知道修复或解决方法是否出现过?我似乎找不到任何有关此的最新信息。
这是一个可重现的示例:
#include <cstdio>
__device__ int *devData;
__global__ void initKernel()
{
devData = new int[6];
devData[0] = 0;
devData[1] = 1;
devData[2] = 2;
devData[3] = 3;
devData[4] = 4;
devData[5] = 5;
}
__global__ void printKernel()
{
printf("Testing device: %d\n", devData[3]);
}
int main()
{
initKernel<<<1,1>>>();
cudaDeviceSynchronize();
printKernel<<<1,1>>>();
cudaDeviceSynchronize();
int *devAddr;
cudaGetSymbolAddress((void **)&devAddr, devData);
int *hostData = new int[6];
cudaMemcpy(hostData, devAddr, 6*sizeof(int), cudaMemcpyDeviceToHost)); //cudaErrorInvalidValue (invalid argument)
//same error with: cudaMemcpyFromSymbol(hostData, devData, 6*sizeof(int));
printf("Testing host: %d\n", testHost[3]);
return 0;
}
这会抛出一个cuda错误无效值对于 cudaMemcpy(与 cudaMemcpyFromSymbol 相同)。当我使用时这不会引发错误__device__ int devData[6];
代替__device__ int *devData;
并按预期打印 3。
这仍然是不可能的。
这记录在编程指南.
此外,设备 malloc() 内存不能在任何运行时或驱动程序 API 调用(即 cudaMemcpy、cudaMemset 等)中使用。
如果您的分配中有由内核创建的数据malloc()
如果您希望传输到主机,则需要先将该数据传输到设备内存分配(或托管分配),然后再复制到主机或在主机代码中使用。
内核中的相同注释和使用的所有方面malloc
同样适用于内核中new
以及内核中的cudaMalloc
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)