Skip to main content
QUICK REVIEW

[論文レビュー] GPU Multisplit: an extended study of a parallel algorithm

Saman Ashkiani, Andrew Davidson|arXiv (Cornell University)|Jan 5, 2017
Parallel Computing and Optimization Techniques参考文献 28被引用数 12
ひとこと要約

本稿では、ユーザー定義のキー基準に基づいてデータを連続するバケツに効率的に分割する、高性能な並列アルゴリズムであるGPU Multisplitを提示する。ワープ同期プログラミング、階層的サブプロブレム分解、最適化されたメモリアクセスパターンを用いることで、GeForce GTX 1080で18.93 Gkeys/sの性能を達成し、ソートベースの代替手法を上回り、3.0 Gkeys/sのスループットで効率的な基数ソートを可能にする。

ABSTRACT

Multisplit is a broadly useful parallel primitive that permutes its input data into contiguous buckets or bins, where the function that categorizes an element into a bucket is provided by the programmer. Due to the lack of an efficient multisplit on GPUs, programmers often choose to implement multisplit with a sort. One way is to first generate an auxiliary array of bucket IDs and then sort input data based on it. In case smaller indexed buckets possess smaller valued keys, another way for multisplit is to directly sort input data. Both methods are inefficient and require more work than necessary: the former requires more expensive data movements while the latter spends unnecessary effort in sorting elements within each bucket. In this work, we provide a parallel model and multiple implementations for the multisplit problem. Our principal focus is multisplit for a small (up to 256) number of buckets. We use warp-synchronous programming models and emphasize warp-wide communications to avoid branch divergence and reduce memory usage. We also hierarchically reorder input elements to achieve better coalescing of global memory accesses. On a GeForce GTX 1080 GPU, we can reach a peak throughput of 18.93 Gkeys/s (or 11.68 Gpairs/s) for a key-only (or key-value) multisplit. Finally, we demonstrate how multisplit can be used as a building block for radix sort. In our multisplit-based sort implementation, we achieve comparable performance to the fastest GPU sort routines, sorting 32-bit keys (and key-value pairs) with a throughput of 3.0 G keys/s (and 2.1 Gpair/s).

研究の動機と目的

  • GPU上で効率的なマルチスプリットプリミティブが不足している問題に対処し、プログラマーが非最適なソートベースの代替手法に頼らなくてよくなるようにすること。
  • メモリ移動を最小限に抑え、不要なバケツ内ソートを回避する並列マルチスプリットアルゴリズムを設計すること。
  • 階層的サブプロブレムの組織化とワープ同期通信を最適化することで、分岐の不整合を低減し、メモリコalescingを向上させること。
  • マルチスプリットが基数ソートのような高性能GPUプリミティブの構築要素としての有効性を示すこと。
  • 特にバケツ数が少ない場合(最大256まで)に、現代のGPUでピーク性能を達成すること。

提案手法

  • 分岐の不整合を排除し、メモリ使用量を削減するため、ワープ同期プログラミングモデルを採用する。
  • 複数段階のサブプロブレム局在化を伴う階層的分割統治法を用い、グローバルメモリ操作を最小限に抑える。
  • グローバルメモリアクセスのコalescingを向上させるために、入力要素を階層的に再配置する。
  • ワープ内でのデータフローと縮約を効率的に管理するため、シャッフルやボールォット命令などのワープワイドプリミティブを活用する。
  • ローカル計算とグローバル同期のバランスを取るために、パラメータ $L_0, L_1, ..., L_{\lambda-1}$ を用いた多段階局在化スキームを設計する。
  • 階層的サブプロブレムを横断するバケツカウントの再帰的総和により、最終的な順列を計算する。

実験結果

リサーチクエスチョン

  • RQ1GPU上でソートベースの実装に起因するパフォーマンスの落とし穴を回避できるマルチスプリットアルゴリズムをどのように設計できるか?
  • RQ2階層的サブプロブレム分解は、グローバルメモリアクセスと同期のオーバーヘッドをどのように低減するか?
  • RQ3ワープ同期プリミティブとメモリアクセス最適化は、スループットとスケーラビリティにどのように影響を与えるか?
  • RQ4マルチスプリットは、基数ソートのような他のGPUプリミティブの効率的な構築要素として利用可能か?
  • RQ5現代のGPUにおけるマルチスプリット実装の理論的および実用的パフォーマンスの上限は何か?

主な発見

  • 提示されたGPU Multisplit実装は、GeForce GTX 1080 GPU上で、キーのみ(またはキー値ペア)のマルチスプリットにおいて、ピークスループット18.93 Gkeys/s(または11.68 Gpairs/s)を達成した。
  • アルゴリズムは、ソートベースのマルチスプリット手法に内在する不要なバケツ内ソートを回避することで、余分な作業を削減した。
  • 階層的局在化とワープ同期プログラミングを用いることで、グローバルメモリアクセスと分岐の不整合が最小限に抑えられた。
  • マルチスプリットベースの基数ソート実装は、3.0 Gkeys/s(2.1 Gpairs/s)のスループットを達成し、最も高速なGPUソートルーチンと同等の性能を示した。
  • 階層的アプローチにより、ローカルメモリ(レジスタおよび共有メモリ)の効率的利用が可能になり、高コストなグローバルメモリ操作への依存が減少した。
  • 特にバケツ数が少ない場合(≤256)に、ソートベースの代替手法に比べて顕著なパフォーマンス向上が見られた。

より良い研究を、今すぐ始めましょう

論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。

クレジットカード登録不要

このレビューはAIが作成し、人間の編集者が確認しました。