0

n 個の間隔またはドメインのリストがあります。各間隔を並行して k 個の部分に分割し、新しいリスト (順序なし) を作成したいと思います。ただし、ほとんどのサブディビジョンは特定の基準を満たしていないため、新しいリストに追加する必要はありません。

cilk::reducer_list_append は、push_back を使用してリストを形成する並列リダクションの考え方を拡張します。このようにして、有効なサブインターバルのみを並行して収集できます。

タスクを達成するための推進方法は何ですか? 1つの方法は、大きな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 に答える