在__device / global__ CUDA内核中动态分配内存

根据CUDA编程指南 ,第122页,只要我们使用计算体系结构2.x,就可以在设备/全局函数内动态分配内存。

我的问题是,当我尝试这个时,我得到命令行消息:

命令“some command”-gencode = arch = compute_10,code = \“sm_10,compute_10 \”-gencode = arch = compute_20,code = \“sm_20,compute_20 \”等……

接下来是一个错误,表示您无法从设备/全局函数调用主机函数(malloc)。

上面的消息显示它正在尝试在compute 1.x下编译。 我正在使用VS2010并在“CUDA C / C ++”属性页中将“代码生成”设置为“compute_20,sm_20”,因此我不确定为什么它仍在尝试在compute 1.x下编译。 我肯定使用支持2.x的卡。 有任何想法吗?

您应该能够在输出中看到nvcc命令行。 事实上,我认为你粘贴了所有的-gencode / etc。 在它你的命令行。 因此,它也certificate您正在编译sm_10和sm_20的代码,这就是您在调用malloc时遇到错误的原因。

您可以通过使用#if __CUDA_ARCH__ >= 200包装对malloc的调用来确认,并查看错误是否消失。

我猜你在项目的.cu文件的默认属性中设置了为sm_20编译的属性,但是将.cu文件添加到项目之后。 将文件添加到项目时,默认值可能设置为sm_10和sm_20(这是.rules文件的默认值)。 如果右键单击文件本身,您可能会看到sm_20已被选中。 只是一种预感。