CUDA中的指针数组

时间:2011-11-25 17:22:55

标签: c cuda

是否可以将指针数组传递给cuda内核? 我正在寻找这样的事情:

__global__ void Kernel(int **arr)  
{  
     int *temp = arr[blockDim.x];
     temp[blockIdx.x] = blockIdx.x;
}  

我如何为这种结构分配cuda内存?

2 个答案:

答案 0 :(得分:4)

此类阵列的内存分配不是问题,您可以通过cudaMalloc(sizeof(void *)* SIZE)来完成此操作。但是,将正确的值写入其中是主要问题。从主机功能更改设备内存中的值的唯一方法实际上是将信息从主机内存复制到设备内存(cudaMemcpy()或cudaMemcpyToSymbol())。因此,要将设备指针写入设备存储器,我们必须在主机存储器中有指向设备存储器的指针,我认为这是不可能的。 (存储在由cudaMalloc()分配的主变量中的指针不是设备存储器中的实际指针。因此,在数组中编写正确值的唯一方法是从内核,这使得指针数组不方便。 我建议使用索引而不是指针,它要好得多。基本上如果在你的索引数组中你写了{4,3,0,1,2},那就意味着第一个元素指向索引4中的某个数组,第二个指向第3个元素,依此类推。如果要指向多个数组,则应该通过某些规则进行索引,在该规则中,您将填充索引数组,并在其中从内核访问内存。

答案 1 :(得分:1)

我目前正在CUDA中进行一些图像处理工作,我建议您只分配一个线性内存缓冲区并使用索引方案而不是处理指针数组。这是方式,在我的经验中更简单。我的2c。