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つの配列の場合、
と
(灰色一つに斜線)最初の配列に53見つけるなるように2番目の配列のそれぞれの位置は11であるため、最終配列の位置は(11 + 11 = 22)です。同様に青色で網掛けされた第1のアレイ上の53の位置は(11 + 12 = 23)である。
2番目の配列の53を取ると、その最終位置も(11 + 11 = 22)として与えられます。第1のアレイ上の灰色53と衝突する。
私の理解によれば、単純なバイナリ検索アルゴリズムを使用してこれら2つの配列をマージすることはできません。この競合を解決する既知の方法またはより簡単な方法はありますか?論文で
これを使用しても、青色の53が他の値であることを考えると、灰色の53の最終的な場所を見つけようとすると、まだ競合しませんか? – BAdhi
私たちはしません。 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
私は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