2011-11-25 126 views
1

是否可以将指针数组传递给cuda内核?
我期待这样的事情:CUDA中的指针阵列

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

我如何分配CUDA内存这样的结构?

+0

[CUDA分配数组的数组]的可能重复(http://stackoverflow.com/questions/1835537/cuda-allocating-array-of-arrays) – talonmies

+1

这个问题的正确解决方案可以找到[在这个答案](http://stackoverflow.com/q/1887312/681865) – talonmies

回答

3

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

1

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