0

短いバージョン:CUDAで効率的なフィルター操作を実装するにはどうすればよいですか?

長いバージョン:キューフィルタリングセマンティクスに従うCUDAコードがあります。キューには最大500万の初期要素があり、コードは「高価な」段階的な計算を使用してそれらをフィルタリングします。最終結果は約1000の要素を保持すると予想され、削除された要素の数は各段階で指数関数的減衰曲線に従います(つまり、最初の段階では多くが削除され、最後の段階ではほとんど削除されません)。

GPUでは、各要素が(スレッドのブロックによって)並列に処理されるため、「すべての要素に対してすべてのステージ」を実行するだけでは、無駄がいっぱいになります。特定の段階で、1つの要素が保持され、他のすべての要素がすでに削除されている場合がありますが、すでに「削除の準備ができている」要素についても、残りのすべての段階で計算が続行されます。

より効率的なアプローチは、各ステージを個別に実行し、入力リストを読み取り、結果を中間出力リストに保存することです。次に、ピンポンスキーマで実行を続けます。ただし、これを行うと、重要なグローバルメモリの読み取り/書き込みが生成され、さらに重要なことに、出力リストの同時書き込みを同期するatomicIncに圧力がかかります。

このような段階的なフィルタリングをどのように提案しますか?

あなたの答えと提案をありがとう。

4

1 に答える 1

3

compactまたはを使用することをお勧めしますremove_ifCUDPPライブラリまたはを使用できますthrust。すべての要素のすべてのステージを計算しない限り、各ステージの後にグローバルメモリへの書き込みを回避することはできません。

これは単純な擬似コードです。

  1. 初期メモリなど。
  2. foreachステージ
  3. すべての要素に対してフィルタリングを実行します
  4. すべての要素にcompact/remove_ifを使用します
  5. 要素を書き直すか、何か他のことをします(使用するライブラリによって異なります)
  6. 最後のステージが壊れた場合は4に進みます
于 2012-10-23T12:08:57.173 に答える