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

3
根据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)。
以上消息显示它正在尝试在计算1.x下进行编译。我正在使用VS2010,并在“CUDA C/C++”属性页面中将“代码生成”设置为“compute_20,sm_20”,因此我不确定为什么它仍然尝试在计算1.x下进行编译。我肯定是在使用支持2.x的显卡。有什么想法吗?
1个回答

3
您应该能够在输出中看到nvcc命令行。实际上,我认为您复制的那部分带有所有-gencode等内容的文本就是您的命令行。因此,这也证明您正在编译代码以支持sm_10和sm_20,这就是为什么在调用malloc时出现错误的原因。
您可以通过在对malloc的调用周围添加#if __CUDA_ARCH__ >= 200来确认,并查看错误是否消失。
我猜您在将.cu文件添加到项目后,设置了默认属性以针对sm_20进行编译。当文件添加到项目时,默认值可能设置为sm_10和sm_20(这是.rules文件的默认值)。如果您右键单击文件本身,则可能会看到sm_20已被选中。只是一个猜想。

1
你是正确的 - 我已经将默认属性设置为在compute_20,sm_20下编译。但是当我检查文件本身的属性时,它仍然设置为compute_20,sm_20和compute_10,sm_10。修改这个问题现在让我的代码成功编译。 - Barjavel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接