我有一个 n 间隔或域的列表。我想将每个间隔并行细分为 k 个部分,创建一个新列表(无序)。但是,大多数细分不会通过某些标准,不应添加到新列表中。
cilk::reducer_list_append 将并行归约的想法扩展为使用 push_back 形成一个列表。这样我只能并行收集有效的子间隔。
完成任务的推力方式是什么?我怀疑一种方法是形成一个大的 nxk 列表,然后使用并行过滤器和流压缩?但我真的希望有一个减少列表追加操作,因为 nxk 确实可以非常大。
我是这个论坛的新手,但也许你会发现其中一些很有用。如果你不喜欢 Thrust,你也可以看看Arrayfire。我最近才知道它,它对这类问题是免费的。
例如,使用 arrayfire,您可以使用 gfor 构造并行评估每个间隔的选择标准,即。考虑:
// # of intervals n and # of subintervals k
const int n = 10, k = 5;
// this array represets original intervals
array A = seq(n); // A = 0,1,2,...,n-1
// for each interval A[i], subI[i] counts # of subintervals
array subI = zeros(n);
gfor(array i, n) { // in parallel for all intervals
// here evaluate your predicate for interval's subdivision
array pred = A(i)*A(i) + 1234;
subI(i) = pred % (k + 1);
}
//array acc = accum(subI);
int n_total = sum<float>(subI); // compute the total # of intervals
// this array keeps intervals after subdivision
array B = zeros(n_total);
std::cout << "total # of subintervals: " << n_total << "\n";
print(A);
print(subI);
gfor(array i, n_total) {
// populate the array of new intervals
B(i) = ...
}
print(B);
当然,这取决于您的间隔的表示方式以及您使用哪个标准进行细分。.