1

並べ替える必要がある大量のデータがあり、それぞれ数万の値を持つ数百万の配列があります。私が疑問に思っているのは、次のとおりです。

GPUで並列ソートアルゴリズムを実装し、すべての配列で実行する方が良いですか?

また

クイックソートなどのシングル スレッド アルゴリズムを実装し、GPU の各スレッドに異なる配列を割り当てます。

明らかに、速度が最も重要な要素です。シングル スレッドの並べ替えアルゴリズムでは、メモリが制限要因になります。私はすでに再帰的なクイックソートを実装しようとしましたが、大量のデータでは機能しないようですので、メモリの問題があると仮定しています.

ソートされるデータ型が長いため、数値のバイナリ表現が長すぎるという事実により、基数ソートが可能になるとは思いません。

任意のポインタをいただければ幸いです。

4

1 に答える 1

5

ソートは、多くの注目を集めている操作です。高性能に関心がある場合は、独自のソートを作成することはお勧めできません。GPU での並べ替えには、 throw 、 back40computing 、 moderngpuまたはCUBなど検討します。

上記のほとんどは、一度に配列を処理し、完全な GPU を使用して配列を並べ替えます。スラストには、複数の配列を「一度に」処理できるベクトル化された並べ替えを行うための手法があり、CUB は「スレッドごと」の並べ替え (たとえば、「スレッド ブロックごと」) を行うためのオプションになる場合もあります。

一般に、CPU ソート コードについても同じことが言えます。自分で書かないでください。

編集:もう1つコメントがあると思います。あなたが言及した最初のアプローチ(つまり、スレッドごとにソートを行わない)に大きく傾いています。これには2つの関連する理由があります。

  1. 高速な並べ替え作業のほとんどは、2 番目の方法ではなく、最初の方法に従って行われました。
  2. 作業が SIMD または SIMT に適切に適合している場合、GPU は一般的に高速です。これは、通常、各スレッドが同じことを行い、分岐とワープの発散を最小限に抑えることを意味します。これは、各スレッドが同じシーケンスに従っているように見えますが、実際にはデータの依存関係が「アルゴリズムの相違」を引き起こしている 2 番目のケースでは実現が困難です (私が思うに) 。表面的には、最初のアプローチに同じ批判が向けられるのではないかと思うかもしれませんが、私が言及したこれらのライブラリは専門家によって作成されているため、SIMT アーキテクチャを最大限に活用する方法を認識しています。スラスト「ベクトル化ソート」と CUB アプローチにより、SIMT アーキテクチャを活用しながら、操作ごとに複数のソートを実行できます。
于 2013-07-13T19:26:33.363 に答える