1

我正在使用 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”)。

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

4

1 回答 1

2

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

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

于 2013-05-31T10:06:58.023 回答