首页 文章

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

提问于
浏览
3

根据CUDA Programming Guide,第122页,只要我们使用的是计算体系结构2.x,就可以在 device/global 函数内动态分配内存 .

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

命令“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”属性页面中将“Code Generation”设置为“compute_20,sm_20”,因此我不确定为什么它仍在尝试在compute 1.x下编译 . 我肯定使用支持2.x的卡 . 有任何想法吗?

1 回答

  • 3

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

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

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

相关问题