どの並列ソートアルゴリズムが平均のケースパフォーマンスが最も良いですか?


134

シリアルの場合、並べ替えにはO(n log n)かかります。O(n)プロセッサがあれば、線形の高速化が期待できます。O(log n)並列アルゴリズムは存在しますが、非常に高い定数を持っています。また、O(n)プロセッサの近くにないハードウェアには適用されません。pプロセッサでは、妥当なアルゴリズムはO(n / p log n)時間かかるはずです。

シリアルの場合、クイックソートは平均して実行時の複雑さが最も優れています。並列クイックソートアルゴリズムは実装が簡単です(ここここを参照)。ただし、最初のステップはコレクション全体を単一のコアに分割することであるため、パフォーマンスはよくありません。多くの並列ソートアルゴリズムに関する情報を見つけましたが、これまでのところ、明確な勝者を指すものは何もありません。

8から32コアで実行されているJVM言語で、100万から1億の要素のリストをソートしようとしています。


@ジョン何でも本当に。これらはすべて異なるドメインオブジェクトですが、すべてComparableを実装しています。
クレイグP.モトリン

1
私はあなたがあなたの「すべきである」に多すぎるn / pを持っていると思います
Sparr

@Sparrそうは思いません。プロセッサー数が少ないことと、並べ替えられる要素と同じ数のプロセッサーがあることを区別しています。
クレイグP.モトリン

@ CraigP.Motlinは正しいですが、/ pを誤って「配布」したようです。/ pは1つだけです。
Sparr、

@Sparrああ、変更しました。ありがとう。
クレイグP.モトリン

回答:


205

次の記事(PDFダウンロード)は、さまざまなアーキテクチャーでの並列ソートアルゴリズムの比較研究です。

さまざまなアーキテクチャでの並列ソートアルゴリズム

記事によると、サンプルの並べ替えは、多くの並列アーキテクチャタイプで最適のようです。

マークの年齢の懸念に対処するための更新:

以下は、より斬新なものを紹介する最近の記事です(2007年以降、サンプルの並べ替えと比較されています)。

サンプルソート AA-Sortの改善

最先端(2010年頃、数か月前のものもある):

並列ソートパターン
メニーコアGPUベースの並列ソート
ハイブリッドCPU / GPU並列ソート
ランダム化並列ソートアルゴリズムと実験的研究
非常にスケーラブルな並列ソート
自然順序を使用したN要素のソート:新しい適応ソートアプローチ

2013年の更新:2013年 1月頃の最先端です(注:リンクのいくつかはCiteseerの論文へのリンクであり、無料の登録が必要です):

大学の講義:
選択と並べ替えのための並列分割
並列並べ替えアルゴリズム講義
並列並べ替えアルゴリズム講義2
並列並べ替えアルゴリズム講義3

その他の出典と論文:
適応ビットニックソートに基づくメニーコアアーキテクチャ向けの新しい並べ替えアルゴリズム
高度にスケーラブルな並列並べ替え2
並列マージ
並列
オブジェクトの2つの並列自己
分類システムのマージ順次クイックソートと並列クイックソートのアルゴリズムのパフォーマンス比較
共有メモリ、メッセージパッシング、およびスタンドアロンおよびクラスター化SMPのハイブリッドマージソート
実装を含むさまざまな並列アルゴリズム(ソートなど)

GPUとCPU / GPUのハイブリッドソースとペーパー:
GPUアーキテクチャ用の並列ソートアルゴリズムのOpenCLメソッド
グラフィックスプロセッシングユニットを使用したデータのソートGPU
でのソートに
効率的なアルゴリズムメニーコアGPUの効率的なソートアルゴリズムの設計GPUの
決定論的サンプルソートGPUの
高速インプレースソートビットニックソートに基づくCUDA
ハイブリッドアルゴリズムを使用した高速並列GPUソートGPUでの
高速並列ソートアルゴリズム
CPUおよびGPUでの高速ソート:帯域幅を気にしないSIMDソートのケース
GPUサンプルソート
GPU-ABiSort:ストリームアーキテクチャでの最適な並列ソート
GPUTeraSort:高大規模なデータベース管理のための高性能グラフィックスコプロセッサソート
メニーコアGPUでの高性能の比較ベースのソートアルゴリズム
CUDA対応のGPUの並列外部ソート、ロードバランシングと低い転送オーバーヘッド
大規模なデータセットのGPUでのソート:完全な比較


2
これは、1996年に現在行われているさまざまなアーキテクチャでの並列ソートアルゴリズムの比較研究です。それ以降、並列コンピューティングは大きく変化しました。
ハイパフォーマンスマーク

1
IMHOが何よりも優れている、マルチコアSIMDアーキテクチャでの効率的な並べ替えの実装を見逃しているようです。VLDB 2008で発表されたインテルの研究から、
alecco

1
これはかつて素晴らしい答えだったでしょう。現在、ほとんどのリンクが壊れています。
Tim Long

6

私は、並列クイックソートアルゴリズムと、基本的にクイックソートとマージを組み合わせたPSRSアルゴリズムの両方を使用してきました。

Parallel Quicksortアルゴリズムを使用して、最大4コア(ハイパースレッディングを備えたデュアルコア)でのほぼ線形の高速化を実証しましたが、これはアルゴリズムの制限が与えられた場合に予想されます。純粋なParallel Quicksortは共有スタックリソースに依存しているため、スレッド間の競合が発生し、パフォーマンスの向上が抑えられます。このアルゴリズムの利点は、「インプレース」で並べ替えられるため、必要なメモリの量が削減されることです。あなたが述べたように1億以上の要素をソートするとき、これを考慮したいかもしれません。

8-32コアのシステムでのソートを検討しているようですね。PSRSアルゴリズムは、共有リソースでの競合を回避し、より多くのプロセスでの高速化を可能にします。私は上記のように最大4コアのアルゴリズムを示しましたが、他の実験結果では、コアの数が32以上で、ほぼ線形の高速化が報告されています。PSRSアルゴリズムの欠点は、インプレースではなく、かなり多くのメモリを必要とすることです。

興味がある場合は、これらのアルゴリズムごとに私のJavaコードを使用または熟読できます。github:https : //github.com/broadbear/sortで見つけることができます。コードは、Java Collections.sort()のドロップイン置換として意図されています。上記のようにJVMで並列ソートを実行する機能を探している場合は、私のリポジトリのコードが役立ちます。APIは、Comparableを実装する要素または独自のコンパレータを実装する要素に対して完全に汎用化されています。

その多くの要素を分類するために何を探しているのか尋ねてもいいですか?私の分類パッケージの潜在的なアプリケーションを知りたいです。


8コアのプロセッサを入手しました。:)今、私は40M以上の要素のソートをテストしました。線形的な高速化は見られませんが、マルチスレッドのTimsortであるとされる標準のJava 8コレクションのソートアルゴリズムよりも大幅にパフォーマンスが向上しています。私のPSRS実装では、デフォルトのJDKソートアルゴリズムの19759ミリ秒と比較して、平均4985ミリ秒で40M要素をソートします。
Broadbear 2016


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.