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

标签 c visual-studio-2010 cuda parallel-processing

根据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/

相关文章:

c# - 在事件服务失败时仅重试一次服务调用逻辑帮助

c++ - CUDA:如何创建2D纹理对象?

c - 如何在 rodata 中初始化灵活数组并创建指向它的指针?

c - C-使用指针时出现strncpy段错误

c++ - 到 system() 还是 fork()/exec()?

c - 执行字符串操作时出现一些错误

visual-studio-2010 - 带有 git 的 Visual Studio (Microsoft) 符号服务器

mysql - 备份问题

windows - Windows 上的 CUDA 安装

concurrency - 是否可以为只写操作设置竞争条件?