Merge sortは、divide-and-conquerメソッドを使用することにより、うまく並列化されます。 複数の並列するアルゴリズムが開発されています。 並列マージソートアルゴリズムの中には、順次トップダウンマージアルゴリズムと強く関連しているものもあれば、一般的な構造が異なり、K-wayマージメソッド
並列再帰によるマージソート編集
シーケンシャルマージソート手順は、分割フェーズとマージフェーズの二つのフェーズで記述できます。, 最初のものは、サブシーケンスが自明にソートされるまで(要素が一つまたはまったく含まれていない)同じ除算プロセスを繰り返し実行する多くの再帰 直感的なアプローチは、これらの再帰呼び出しの並列化です。 以下の擬似コードは、forkおよびjoinキーワードを使用した並列再帰によるマージソートについて説明します。
このアルゴリズムは、順次バージョンの些細な変更であり、うまく並列化されません。 したがって、その高速化はあまり印象的ではありません。, これはシーケンシャルバージョンと比較してΣ(logn){\displaystyle\Theta(\log n)}を改良しただけのものである(アルゴリズムの紹介を参照)。 これは主に、並列実行のボトルネックであるsequential mergeメソッドによるものです。
並列マージによるマージソート編集
並列マージアルゴリズムを使用することにより、より良い並列処理を実現できます。 Cormen et al. 二つのソートされたサブシーケンスを一つのソートされた出力シーケンスにマージするバ,
いずれかのシーケンス(長さが等しくない場合は長いもの)では、中央のインデックスの要素が選択されます。 他のシーケンス内の位置は、この要素がこの位置に挿入された場合、このシーケンスがソートされたままになるように決定されます。 したがって、両方のシーケンスからの他の要素の数がより小さく、出力シーケンス内の選択された要素の位置を計算できることがわかります。 このようにして作成された小さい要素と大きい要素の部分シーケンスについては、再帰の基本ケースに達するまでマージアルゴリズムが再び並列に実行,
以下の擬似コードは、並列マージアルゴリズムを使用した変更された並列マージソート方法を示しています(Cormen et al.).
最悪の場合のスパンの再帰関係を分析するためには、parallelMergesortの再帰呼び出しを並列実行のために一度だけ組み込む必要があります。
並列マージ手順の複雑さについての詳細については、”マージアルゴリズム”を参照してください。,
この漸化式の解は
T∞sort=Θ(log(n)3){\textstyle T_{\infty}^{\text{sort}}=\Theta\left(\log(n)^{3}\right)}によって与えられる。
Parallel multiway merge sortEdit
マージソートアルゴリズムをバイナリマージメソッドに制限するのは任意のようです。p>2つのプロセッサが より良いアプローチは、k{\displaystyle k}ソートされたシーケンスが一緒にマージされるバイナリマージの一般化であるKウェイマージ法を使用することである。, このマージバリアントは、PRAM上のソートアルゴリズムを記述するのに適してい
Basic IdeaEdit
四つのプロセッサt0{\displaystyle t_{0}}からt3{\displaystyle t_{3}}までの並列マルチウェイマージソートプロセス。
マルチシーケンスselectionEdit
PseudocodeEdit
以下に、並列マルチウェイマージソートアルゴリズムの完全な擬似コードを示します。, すべてのプロセッサが分割要素とシーケンス分割を適切に決定できるように,マルチシーケンス選択の前後にバリア同期があると仮定した。
AnalysisEdit
実用的な適応とapplicationEdit
マルチウェイマージソートアルゴリズムは、多くのプロセッサを使用できる高い並列化機能により非常にスケーラブルです。 このアルゴリズムの実行可能な候補者の選別大量のデータなどの処理をコンピュータクラスター, また、このシステムメモリは通常の制限は、資源の欠点は、スペースの複雑さの合併に並べ替えができます。 しかし、このようなシステムでは、乳母車でモデル化するときに考慮されない他の要因が重要になります。 ここでは、データがプロセッサのキャッシュに収まらないときのメモリ階層、または共有メモリを介してデータにアクセスできなくなったときにボトルネックになる可能性のあるプロセッサ間のデータ交換の通信オーバーヘッドを考慮する必要があります。Sanders et al., 彼らの論文では、p{\displaystyle p}プロセッサをサイズp'{\displaystyle p’}のr{\displaystyle r}グループに分割する、マルチレベルマルチウェイマージソートのためのバルク同期並列アルゴリズムを提示している。 すべてのプロセッサのソート地です。 シングルレベルマルチウェイマージソートとは異なり、これらのシーケンスはr{\displaystyle r}部分に分割され、適切なプロセッサグループに割り当てら これらのステップを繰り返し再帰的に含ます。 この通信や回避には問題は多くの小さなメッセージ, 基礎となる実ネットワークの階層構造は、プロセッサグループ(例えば、ラック、クラスタ、。..).
さらなるVariantsEdit
マージソートは、最適なスピードアップが達成された最初のソートアルゴリズムの一つであり、Richard Coleは巧妙なサブサンプリングアルゴリズムを使用してO(1)マージを確実にした。 その他の高度な並列ソートアルゴリズムを実現できる同一またはより良い時間枠の低い定数です。, たとえば、1991年にDavid Powersは、n個のプロセッサを持つCRCW parallel random-access machine(PRAM)上で暗黙的にパーティショニングを実行することによってO(log n)時間で動作できる並列化クイックソート(および関連する基数ソート)を記述した。 Powersはさらに、バタフライソートネットワーク上のO((log n)2)時間におけるBatcherのBitonic Mergesortのパイプライン化バージョンは、実際にはPRAM上のO(log n)ソートよりも実際高速であり、比較、基数、並列ソートにおける隠されたオーバーヘッドについて詳細な議論を提供していることを示している。