有没有办法声明一个数组,如:
int arraySize = 10;
int array[arraySize];
在CUDA内核/函数中?我在另一篇文章中读到,我可以在内核调用中声明共享内存的大小,然后我就能做到:
int array[];
但我不能这样做。我收到编译错误:“不允许不完整的类型”。另外,我还读到可以在线程内调用printf(),这也会引发错误:“无法从设备/全局函数内部调用主机函数”。
我有什么办法可以在CUDA中制作可变大小的数组或等效数组吗?我的计算能力是1.1,这与它有什么关系吗?我可以通过定义typedef struct
来定义一个可以设置的大小变量的{{1}}来解决线程中可变大小的数组声明吗?除1.1之外,计算能力的解决方案也是受欢这是一个班级团队项目,如果至少有一些方法可以做到这一点,我至少可以提供这些信息。
答案 0 :(得分:2)
关于printf,问题是它只适用于计算能力2.x.您可以尝试另外一种cuPrintf。
对于在CUDA中分配可变大小的数组,你可以这样做:
extern __shared__ int[];
mykernel<<<gridsize, blocksize, sharedmemsize>>>();
有关__shared__
限定符的第{B.2.3节} CUDA C programming guide中对此进行了解释。
答案 1 :(得分:0)
如果您的阵列可能很大,一个解决方案是让一个内核计算所需的数组大小,将它们存储在一个数组中,然后在该调用之后,主机分配必要的数组并将一个指针数组传递给线程,然后你将计算作为第二个内核运行。
这是否有帮助取决于你必须做什么,因为它将是在全局内存中分配的数组。如果数组的总大小(每个块)小于可用共享内存的大小,那么你可以拥有一个足够大的共享内存数组,让你的线程在它们之间进行分离。