CUDA中的可变大小数组

时间:2011-11-25 08:56:09

标签: cuda

有没有办法声明一个数组,如:

int arraySize = 10;
int array[arraySize];

在CUDA内核/函数中?我在另一篇文章中读到,我可以在内核调用中声明共享内存的大小,然后我就能做到:

int array[];

但我不能这样做。我收到编译错误:“不允许不完整的类型”。另外,我还读到可以在线程内调用printf(),这也会引发错误:“无法从设备/全局函数内部调用主机函数”。

我有什么办法可以在CUDA中制作可变大小的数组或等效数组吗?我的计算能力是1.1,这与它有什么关系吗?我可以通过定义typedef struct来定义一个可以设置的大小变量的{{1}}来解决线程中可变大小的数组声明吗?除1.1之外,计算能力的解决方案也是受欢这是一个班级团队项目,如果至少有一些方法可以做到这一点,我至少可以提供这些信息。

2 个答案:

答案 0 :(得分:2)

关于printf,问题是它只适用于计算能力2.x.您可以尝试另外一种cuPrintf。

对于在CUDA中分配可变大小的数组,你可以这样做:

  • 在内核中编写extern __shared__ int[];
  • 在内核调用中,您将第三个启动参数作为共享内存大小(如mykernel<<<gridsize, blocksize, sharedmemsize>>>();
  • )传递

有关__shared__限定符的第{B.2.3节} CUDA C programming guide中对此进行了解释。

答案 1 :(得分:0)

如果您的阵列可能很大,一个解决方案是让一个内核计算所需的数组大小,将它们存储在一个数组中,然后在该调用之后,主机分配必要的数组并将一个指针数组传递给线程,然后你将计算作为第二个内核运行。

这是否有帮助取决于你必须做什么,因为它将是在全局内存中分配的数组。如果数组的总大小(每个块)小于可用共享内存的大小,那么你可以拥有一个足够大的共享内存数组,让你的线程在它们之间进行分离。