我有一些数组(实际上是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]。这里,
线程tid = 3知道它应该创建c [3],但它怎么知道它应该使用[2]并生成 second 元素呢?
答案 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]会告诉你"本地"你正在构建的当前元素的索引)