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

时间:2015-05-26 12:55:34

标签: arrays parallel-processing cuda

我有一些数组(实际上是push :: 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)时间内找到)与[...]相关联的哪个对应的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]将使用[0]创建,因为b [0] == 2.
  • 使用[1]不会创建任何元素,因为b [1] == 0。
  • c [2]至c [4]将使用[2]创建。
  • c [5]至c [9]将使用[3]创建。

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

1 个答案:

答案 0 :(得分:1)

我建议将b []总结为B [],其中包含元素

    @Override public Response intercept(Chain chain) throws IOException {

        Request request = chain.request();

        if (request != null) {
            RequestBody body = request.body();
            URL requestURL = request.url();
            String method = request.method();
            Headers headers = request.headers();

            Request.Builder signedRequestBuilder = request.newBuilder();
            signedRequestBuilder.addHeader("Authorization", "Your Signature");
            request = signedRequestBuilder.build();
        }
        return chain.proceed(request);
    }
}

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

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

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