ベクトルs.tで2分木を構築したい。親の値は両方の子の合計になります。再帰的にCでツリーを構築するには、次のようになります。2分木を累積的に構築する
int construct(int elements[], int start, int end, int* tree, int index) {
if (start == end) {
tree[index] = elements[start];
return tree[index];
}
int middle = start + (end - start)/2;
tree[index] = construct(elements, start, middle, tree, index*2) +
construct(elements, middle, end, tree, index*2+1);
return tree[index];
}
しかし、私はスレッドを利用することにより、並列の方法でCUDAでそれを構築する方法を知りません。 1 reference有用であるとわかりました
この種の再帰アルゴリズムをどのように並列化するべきですか? 1つの方法は、ガランザ(Garanzha)らによって提示された方法を使用することであり、これはルートから順にノードのレベルを処理する。この考え方は、幅広いノードの配列を幅優先順に維持することで、階層内のすべてのレベルが線形範囲のノードに対応するようにします。与えられたレベルでは、この範囲に入る各ノードごとに1つのスレッドを起動します。スレッドは、最初と最後をノード配列から読み込み、findSplit()を呼び出すことで開始します。次に、結果の子ノードをアトミックカウンタを使用して同じノード配列に追加し、対応するサブ範囲を書き出します。このプロセスは、各レベルが次のラウンドで処理される次のレベルに含まれるノードを出力するように反復する。
各レベルを順次処理し、各レベルでノードを並列化します。私はそれが完全に意味をなさないと思うが、私はそれを正確に実装する方法はありません、誰かが私にそれを行う方法のアイデアや例を教えてもらえますか?