gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:04:24 27 4
gpt4 key购买 nike

我有一些数组(实际上是推力::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] 并生成其第二个元素来执行此操作?

最佳答案

我建议将 b[] 求和到包含元素的 B[]

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

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

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

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

关于arrays - 如何使用 CUDA 将多个线程映射到不同元素具有不同线程数的数组元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30459223/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com