设备内如何动态分配内存?

我想在设备函数内调用cudaMalloc,cudaMemecpy, cudaFree 的函数动态的管理内存。发现出现下面错误。原来这些是主机端函数。
error: calling a host function(“cudaMalloc”) from a device function

请问,对应C语言的 malloc,memcpy, realloc, free, 在cuda中有什么函数与之对应吗?

楼主您好,

(1)
在有DP支持的设备上,kernel里可以直接使用cudaMalloc/cudaFree, 将直接映射成设备端的malloc/free调用。
在无DP支持的设备上(2.0-3.0),您可以在kernel里使用malloc/free。
在无DP支持的古老硬件上(1.x),您无法使用任何。

(2)memcpy您可以直接用,但建议您自己写代码完成复制。

(3)realloc据我所知,似乎不能用的。

感谢您的来访。

版主你好,我在kernel里面使用malloc,提醒错误error: calling a host function(“malloc”) from a global function(“cudamp”) is not allowed,我的显卡是GTX 650的

请您在编译的时候,指定为2.0或者以上的计算能力,以使用这一功能。

怎么样在编译时指定2.0或者以上的计算能力?

请您参考以下讨论帖:

http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6936

祝您好运~

vs2008里面怎么没找到这个选项

VS2008的话,请在项目右键选择属性——配置属性——CUDA Runtime API——GPU——GPU Architecture中选为sm_30,并只保留这个,这是最适合您的配置参数(默认有3项,将另外两个设为0或者设为sm_20,sm_21,或sm_35中的任意两个都行,无影响)。

祝您好运~

非常感谢版主,解决了问题。

不客气的,欢迎您常来论坛~

祝您好运!

非常感谢!!

您好, 谢谢您的帮助,后来在《C_Programming_Guide》5.5版的“C Language Extensions”章的“B18”节里有介绍这个的使用,确实没有提到realloc,只能够重新分配内存然后把原来的内容复制过去。

还想再请教一个问题:DP是什么,什么事DP支持,什么类的显卡支持DP?(不好意思啊,确实不懂,网上也搜不出什么东西。)

非常感谢版主,后来查了一下,在《cuda c programming guide》5.5版的 c language extension 章 的 B.18节中也有阐述这个问题,确实没有realloc。

还想问一个问题:什么是DP,DP支持的设备有那类?(不好意思,确实不懂,网上确实没收到相关资料。)

LZ您好:

DP这里指的是:Dynamic Parallelism,您可以在CUDA 5.5的CUDA C Programming Guide的Appendix.C这个章节看到介绍。(或者看CUDA 5.0 自带的CUDA Dynamic Parallelism Programming Guide)

祝您好运~