2016-08-02 3 views
1

Designing Efficient Sorting Algorithms for Manycore GPUsに記載されているCUDAでマージソートアルゴリズムを実装しようとしています。バイナリ検索を使用した並列マージソート

中間レベルの場合と同様に、2つのソート済み配列(たとえばAとB)を1つの配列にマージするスレッドブロックを割り当てることを提案しました。また、配列Aのdata-a_iにスレッドを割り当て、バイナリ検索を使用してB配列上にそのスレッドの場所を見つけることを考えています。 B上のa_iの位置がjの場合、新しい配列上のa_iの位置は(i + j)

ですが、これを実装したとき(または試行したとき)には、上記の方法がうまくいかない。例えば、以下のようにマージされる必要がある2つの配列の場合、

enter image description here

enter image description here

(灰色一つに斜線)最初の配列に53見つけるなるように2番目の配列のそれぞれの位置は11であるため、最終配列の位置は(11 + 11 = 22)です。同様に青色で網掛けされた第1のアレイ上の53の位置は(11 + 12 = 23)である。

2番目の配列の53を取ると、その最終位置も(11 + 11 = 22)として与えられます。第1のアレイ上の灰色53と衝突する。

私の理解によれば、単純なバイナリ検索アルゴリズムを使用してこれら2つの配列をマージすることはできません。この競合を解決する既知の方法またはより簡単な方法はありますか?論文で

答えて

1

は、私が読んで:ソート順序AとBが与えられ

を、私たちはソート シーケンスC =マージ(A、B)を計算します。これらのシーケンスが十分に小さい場合、 のサイズはそれぞれt = 256個以下の要素のサイズであると言います。 を単一のt-スレッドブロックを使用してマージすることができます。要素ai∈Aの場合、 マージされたシーケンスCの要素aiの位置である 計算ランク(ai、C)のみが必要です。AとBの両方がソートされているので、 ランク(ai、C rank(ai、B)は、要素bj∈Bとbj < aiの単純に の数であり、バイナリ検索を使用して を効率的に計算する、i + rank(ai、B)です。 Bの要素は、明らかに同じ方法で で扱うことができます。

ランク(ai、B)を検索しているときは、バイナリ検索で重複を処理する必要があります。 BをBSTとすると、rank(ai、B)= j {bj < = ai} +1のmaxがうまくいくはずです。

+0

これを使用しても、青色の53が他の値であることを考えると、灰色の53の最終的な場所を見つけようとすると、まだ競合しませんか? – BAdhi

+0

私たちはしません。 A = 78,73,63,53,53、... 53のような配列Aの例を考えてみましょう。Aの別のaiと競合するべきでしょうか?ランク(ai、C)= i +ランク(ai、B)のように、iは実際には配列Aのaiの位置です。実際には、Aの53個ごとに異なります。したがって、 、B)、他のAIとの競合は不可能である。さらに、B = 84,58,58,53,53となるような配列Bを取ると、バイナリ検索はランク(ai、B)がBの他の53でないことを容易に保証します。したがって、rank(53、C)はno他のランク(xi、C)、AUBのxiとxi = 53 – hmicn

+0

私はA = 78,73,53,49,45とB = 84,58,58,53,40のような例を参照していました。ランク(53_A、B)= 3(ここで、53_Aは配列Aの53である)、従ってランク(53_A、C)= 2 + 3 = 5を与えるランク(53_B、 (53_B、C)= 3 + 2 = 5を与えるランク(53_A、C)=ランク(53_B、C) Cの5番目の位置に衝突します – BAdhi

関連する問題