Arrays 如何使用CUDA将多个线程映射到不同元素的不同线程数的数组元素?

Arrays 如何使用CUDA将多个线程映射到不同元素的不同线程数的数组元素?,arrays,parallel-processing,cuda,Arrays,Parallel Processing,Cuda,我有一些数组(实际上是推力::设备向量)- 我必须用它来填补 MyClass2 c[M]; a[0]生成c[]中的前b[0]个元素。a[1]在c[]中生成下一个b[1]元素,依此类推。明确地说,M=b[0]+b[1]+…+b[N-1]。任何b[i]都可以是零。我需要创建c[],然后使用M线程并行处理它的所有M元素 有没有一种方法可以编写一个使用M个线程的内核,其中每个线程都知道(或在O(1)时间内发现)它与[]中对应的MyClass1关联 例如,如果我有N=4和 int b[4] = {2,0

我有一些数组(实际上是推力::设备向量)-

我必须用它来填补

MyClass2 c[M];
a[0]生成c[]中的前b[0]个元素。a[1]在c[]中生成下一个b[1]元素,依此类推。明确地说,M=b[0]+b[1]+…+b[N-1]。任何b[i]都可以是零。我需要创建c[],然后使用M线程并行处理它的所有M元素

有没有一种方法可以编写一个使用M个线程的内核,其中每个线程都知道(或在O(1)时间内发现)它与[]中对应的MyClass1关联

例如,如果我有N=4和

int b[4] = {2,0,3,5};
那么M=2+0+3+5=10,那么c[]的大小是10,我需要10个线程(tid=0…9)来并行处理c[],其中tid=I创建c[I]。这里,

  • c[0]和c[1]将使用a[0]创建,因为b[0]==2
  • 不会使用a[1]创建任何元素,因为b[1]==0
  • 将使用[2]创建c[2]到c[4]
  • 将使用[3]创建c[5]到c[9]

线程tid=3知道它应该创建c[3],但它怎么知道它应该使用a[2]并生成第二个元素来创建c[3]?

我建议将b[]和b[]相加,b[]包含元素

B[i] = sum(b[0] ... b[i])
因此,M=B[N-1],现在启动M个通道,每个通道使用std::lower_bound查找并索引要使用的[]中元素的i

(我可能会在cpu上执行第一步,您可能已经在执行类似的操作来确定M


pidx-B[i]将告诉您当前正在构造的元素的“本地”索引)

我的所有数据都在设备上。最后,我启动了N个线程,其中每个线程将其对应的b[tid]元素写入c[]中的适当位置(我使用前缀b[]来帮助实现这一点)。我也想过像你说的那样进行二进制搜索,但在我的例子中,通常M>>N,甚至O(log(M))都比我的解决方案更糟糕,我想。如果可能的话,我会试试,然后再报告。
B[i] = sum(b[0] ... b[i])