【问题标题】:Dynamically allocating memory inside __device/global__ CUDA kernel在 __device/global__ CUDA 内核中动态分配内存
【发布时间】:2011-10-19 17:50:42
【问题描述】:

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

我的问题是,当我尝试这样做时,我收到了命令行消息:

命令“一些命令” -gencode=arch=compute_10,code=\"sm_10,compute_10\" -gencode=arch=compute_20,code=\"sm_20,compute_20\" 等...

随后出现一个错误,指出您无法从 device/global 函数调用主机函数 (malloc)。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 你是对的 - 我已将默认属性设置为在 compute_20,sm_20 下编译。但是当我检查文件本身的属性时,它仍然设置为 compute_20,sm_20 和 compute_10,sm_10。改变它现在使我的代码编译成功。
    猜你喜欢
    • 2013-09-17
    • 2014-06-10
    • 2012-04-06
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2013-11-09
    相关资源
    最近更新 更多