0

我有一个 n 间隔或域的列表。我想将每个间隔并行细分为 k 个部分,创建一个新列表(无序)。但是,大多数细分不会通过某些标准,不应添加到新列表中。

cilk::reducer_list_append 将并行归约的想法扩展为使用 push_back 形成一个列表。这样我只能并行收集有效的子间隔。

完成任务的推力方式是什么?我怀疑一种方法是形成一个大的 nxk 列表,然后使用并行过滤器和流压缩?但我真的希望有一个减少列表追加操作,因为 nxk 确实可以非常大。

4

1 回答 1

1

我是这个论坛的新手,但也许你会发现其中一些很有用。如果你不喜欢 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);

当然,这取决于您的间隔的表示方式以及您使用哪个标准进行细分。.

于 2012-07-24T07:26:35.600 回答