我正在使用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.
我该怎么做才能解决这个问题?
答案 0 :(得分:2)
因为您使用的是计算1.3设备,所以不支持内核malloc
和C ++ new
运算符(这在CUDA C编程指南中有明确说明)。
您唯一的选择是使用主机端内存分配预先分配临时全局内存区域(这需要至少是t *在GPU上启动的线程数的最大值)。该内存可以作为命令参数传递,也可以写入内核可以读取的常量内存指针。您还可以将temp
声明为内核中的静态大小的本地内存数组。如果事实证明您需要相对较小且先验已知的max(t)
值,那么将内核传递max(t)
模板化为模板参数可能会带来性能优势。