2016-08-10 24 views
0

GPUを使用してNがMよりずっと小さく(N = 10、M = 1000など)、M個の要素からN個の最大要素を取り出す効率的な方法があるかどうかは疑問です。CUDAを使ってM個の要素からN個の最大要素を得るにはどうすればいいですか?N << M?

入力データのサイズが大きいため、GPUからCPUにデータを転送して戻したくないという問題があります。しかし、正確な並べ替えは、スレッドの分岐や実際には気にしない要素のソートに時間がかかるためにうまく機能していないようです(上記のDCエレメントは11〜1000です)。

+1

私はいくつかの最大ヒープがこれらの問題の典型的な解決策だと思います。 – halfelf

+1

@halfelf:あなたが参照しているものであれば、CUDAで最大のバイナリヒープを行うことはお勧めしませんか?あなたは、並列マシン上でこれを行うより具体的な方法がないかぎり? – CygnusX1

+3

N = 10、M = 1000の例を挙げますが、大規模な入力データについて話します。 NとMのあなたの現実的な価値は何ですか? Nに応じて、私は縮小アルゴリズムを適応させるか、ソートアルゴリズムを適応させることを提案する。小さなMの場合でも、それがより大きいCUDAアルゴリズムの一部であれば、それもデバイス上で行うのが良いかもしれません。 – CygnusX1

答えて

1

NがN個の最大値を共有メモリに保持するのに十分小さい場合、グローバルメモリ内のM要素の配列を一度だけ読み込み、すぐにこれらのN個の最大値を書き出す高速実装が可能になります。 Nがブロックあたりのスレッドの最大数を超えない場合、実装はより簡単になります。

シリアルプログラミングとは異なり、ヒープ(または他のより複雑なデータ構造)ではなく、ソートされた配列を使用します。 SMには、ヒープを通過するときに使用されない並列ハードウェアがたくさんあります。スレッドブロック全体を使用して、新しく入力される値より小さい共有メモリアレイの要素をシフトすることができます。

N < = 32の場合、warp shuffle functionsを使用して、N個の最大数値の並べ替えられたリストをレジスタに保持するきちんとした解決策が可能です。

+0

どのようなアルゴリズムが採用されているか詳しく説明できますか?あなたの説明から、最初の段落の共有メモリにN個の最大値を保持し、レジスタを使用して3番目の段落にN個の最大値を保持することに言及します。あなたの投稿の2番目の段落は、ヒープデータ構造を使用しないことを提案します。私の質問は、M個の要素からN個の最大要素を得るのにどのようなアルゴリズムを使うかです。ありがとうございました – LongY

関連する問題