【问题标题】:NVCC rejects my use of malloc() in kernel codeNVCC 拒绝我在内核代码中使用 malloc()
【发布时间】:2013-05-27 02:17:07
【问题描述】:

我正在使用 CUDA 运行 CentOS 版本 5.9(最终版),拥有一张主要版本 1 和次要版本 3 的 Tesla 卡。以下是我的内核代码:

__global__ void foo(int* pos, int t)
{
    int index = blockDim.x * blockIdx.x + threadIdx.x; 
    t = pos [index + 1] - pos [index];  
    char* temp = (char*)malloc(t);
}

我想动态分配t 字节。

这给了我错误:

不允许从 __device__/__global__ 函数(“foo”)调用宿主函数(“malloc”)。

我能做些什么来解决这个问题?

【问题讨论】:

  • 请提供一个实际产生上述错误的示例以及您如何编译它。您问题中的代码无法编译,但由于括号不平衡。此外,具有 CC 1.3 的设备不支持从内核内部分配内存;您至少需要 CC 2.0。此外,要从内核分配内存,您应该调用malloc,而不是cudaMalloc(不过,根据您的错误消息,这是您在实际代码中所做的)。
  • 感谢您的指导,您能建议我解决同样的问题吗?

标签: cuda


【解决方案1】:

由于您使用的是计算 1.3 设备,因此不支持内核 malloc 和 C++ new 运算符(这在 CUDA C 编程指南中有明确说明)。

您唯一的选择是使用主机端内存分配预分配临时全局内存区域(这需要至少是 t * GPU 上启动的线程数的最大值)。该内存可以作为命令参数传递,也可以写入内核可以读取的常量内存指针。您还可以将temp 声明为内核中的静态大小的本地内存数组。如果事实证明您需要一个相对较小且先验已知的 max(t) 值,那么将内核传递 max(t) 模板化为模板参数可能会带来性能优势。

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2018-05-11
    • 2015-09-19
    • 2018-04-27
    相关资源
    最近更新 更多