【问题标题】:How do I map multiple threads to array elements with a different number of threads for different elements using CUDA?如何使用 CUDA 将多个线程映射到具有不同线程数的数组元素?
【发布时间】:2015-05-26 12:55:33
【问题描述】:

我有一些数组(实际上是推力::device_vector)-

MyClass1 a[N];
int b[N];

我必须用来填充

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) 时间内找出)它与 a[] 中的哪个对应的 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。
  • c[2] 到 c[4] 将使用 a[2] 创建。
  • c[5] 到 c[9] 将使用 a[3] 创建。

线程 tid=3 知道它应该创建 c[3],但是它怎么知道它应该使用 a[2] 并生成它的 second 元素来这样做呢? p>

【问题讨论】:

    标签: arrays parallel-processing cuda


    【解决方案1】:

    我建议将 b[] 总结为具有元素的 B[]

    B[i] = sum(b[0] ... b[i])
    

    因此 M = B[N-1],您现在启动 M 个通道,其中每个通道您使用 std::lower_bound 来查找和索引 a[] 中要使用的元素的 i。

    (我可能会在 cpu 上做第一步,你可能已经在做类似的事情来确定 M。

    pidx - B[i] 会告诉你正在构建的当前元素的“本地”索引)

    【讨论】:

    • 我所有的数据都在设备上。最后,我只是启动了 N 个线程,每个线程将其对应的 b[tid] 元素写入 c[] 中的适当位置(我使用 b[] 的前缀和来帮助解决这个问题)。我也想过像你说的那样进行二进制搜索,但在我的情况下,通常 M >> N,甚至 O(log(M)) 会比我的解决方案更糟糕,我认为。如果可能,我会尝试并报告。
    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多