CUDA中的可变大小数组

CUDA中的可变大小数组,cuda,Cuda,是否有任何方法可以声明数组,例如: int arraySize = 10; int array[arraySize]; 在CUDA内核/函数中?我在另一篇文章中读到,我可以在内核调用中声明共享内存的大小,然后我就可以做到: int array[]; 但我不能这样做。我得到一个编译错误:“不允许不完整的类型”。另一方面,我还了解到printf()可以从线程中调用,这也会引发一个错误:“无法从设备/全局函数内部调用主机函数” 我可以在CUDA内部制作一个可变大小的数组或等效数组吗?我在计算能力1

是否有任何方法可以声明数组,例如:

int arraySize = 10;
int array[arraySize];
在CUDA内核/函数中?我在另一篇文章中读到,我可以在内核调用中声明共享内存的大小,然后我就可以做到:

int array[];
但我不能这样做。我得到一个编译错误:“不允许不完整的类型”。另一方面,我还了解到printf()可以从线程中调用,这也会引发一个错误:“无法从设备/全局函数内部调用主机函数”


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

关于printf,问题是它只适用于计算能力2.x。有一种可供选择的纸杯,你可以试试

要在CUDA中分配可变大小的数组,请执行以下操作:

  • 在内核内部编写
    extern\uuuuuuuuuuuuuuuuuu共享的\uuuuuuuuuu int[]
  • 在内核调用中,您将共享内存大小作为第三个启动参数传递,以字节为单位,如
    mykernel()

这在B.2.3节中关于
\uuuu shared\uuuu
限定符的部分中进行了解释。

如果数组可以很大,一种解决方案是使用一个内核来计算所需的数组大小,将其存储在数组中,然后在调用之后,主机分配必要的数组并将指针数组传递给线程,然后将计算作为第二个内核运行


这是否有帮助取决于您必须做什么,因为它是在全局内存中分配的数组。如果阵列的总大小(每个块)小于可用共享内存的大小,则可以拥有足够大的共享内存阵列,并让线程在它们之间协商拆分。

如果每个线程都必须声明不同大小的数组,该怎么办?另外,如果每个线程在其执行过程中决定了这个大小呢?您所说的是在每个线程中使用动态内存分配是可能的,但它确实很慢。而且也只在compute capability 2.x(指南B.15部分)上提供,谢谢。我不知道那时我要做什么。使用GPU的全部意义在于该项目与数据挖掘研究有关,而且算法太慢,因此我不确定我们将如何解决这个问题。传入一个数组,每个线程根据参数数组中的数据构造一个不同的数组,因此共享它不会以这种方式工作。我想与其在一个块中调用多个线程,不如用一个线程调用多个块,这样共享内存空间就不会冲突!!这也将非常缓慢。为了最大限度地提高效率,每个块的线程数应始终是扭曲大小的倍数。您必须考虑并使您的问题适应CUDA体系结构,确定易于并行化的部分。你想做的可能并不适合CUDA,不是所有的事情都适合。当您希望对大数据集上的每个元素执行相同的操作时,CUDA真的会大放异彩。这是SIMD体系结构的方式,单指令,多数据。如果你在一个不同的问题中讲述更多关于你的问题的细节,也许我们可以提供帮助。这是一个非常并行的算法,只是没有正确的组合!似乎总有一个整数或变量需要计算,然后我才能做其他事情。我们有两个解决方案,看起来这一个不会产生我们想要的加速效果。这是一个分类器算法。它将信息离散化,例如植物的花瓣长度、花瓣宽度、植物高度等,目的是分类植物的类型。然后,该算法开始在不同的功能之间一次移除一个阈值,比如花瓣长度,我已经考虑了一些类似的想法,以及其他一些想法,只是试图避免多个内核调用或任何会减慢该算法速度的事情,lol!!我认为这可能是最好的解决方案,谢谢!!在某些情况下,2个简单内核将比1个复杂的一次性完成内核提供更好的性能。尽可能多地利用并行性。分而治之:)