根据CUDA Programming Guide ,第 122 页,只要我们使用计算架构 2.x,就可以在 device/global 函数内动态分配内存。
我的问题是,当我尝试这样做时,我收到命令行消息:
The command "some command" -gencode=arch=compute_10,code=\"sm_10,compute_10\" -gencode=arch=compute_20,code=\"sm_20,compute_20\" etc...
这之后是一个错误,指出您不能从 device/global 函数调用主机函数 (malloc)。
上面的消息表明它正在尝试在 compute 1.x 下编译。我正在使用 VS2010 并在“CUDA C/C++”属性页中将“代码生成”设置为“compute_20,sm_20”,所以我不确定为什么它仍在尝试在 compute 1.x 下编译。我肯定使用支持 2.x 的卡。有什么想法吗?
最佳答案
您应该能够在输出中看到 nvcc 命令行。事实上,我认为您粘贴了所有 -gencode/etc。其中是你的命令行。因此,这也证明你正在编译sm_10和sm_20的代码,这就是你调用malloc时出错的原因。
您可以通过使用 #if __CUDA_ARCH__ >= 200
包装对 malloc 的调用来确认并查看错误是否消失。
我猜您在项目中的 .cu 文件的默认属性中设置了为 sm_20 编译的属性,但是在您将 .cu 文件添加到项目中之后。将文件添加到项目时,默认值可能设置为 sm_10 和 sm_20(这是 .rules 文件的默认值)。如果您右键单击文件本身,您可能会看到 sm_20 已被选中。只是一种预感。
关于c - 在 __device/global__ CUDA 内核中动态分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6937693/