NVCC拒绝在内核代码中使用malloc()

时间:2013-05-31 09:36:39

标签: cuda

我正在使用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个字节。

这给了我错误:

calling a host function("malloc") from a __device__/__global__ function("foo") is not allowed.

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

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