短いバージョン:CUDAで効率的なフィルター操作を実装するにはどうすればよいですか?
長いバージョン:キューフィルタリングセマンティクスに従うCUDAコードがあります。キューには最大500万の初期要素があり、コードは「高価な」段階的な計算を使用してそれらをフィルタリングします。最終結果は約1000の要素を保持すると予想され、削除された要素の数は各段階で指数関数的減衰曲線に従います(つまり、最初の段階では多くが削除され、最後の段階ではほとんど削除されません)。
GPUでは、各要素が(スレッドのブロックによって)並列に処理されるため、「すべての要素に対してすべてのステージ」を実行するだけでは、無駄がいっぱいになります。特定の段階で、1つの要素が保持され、他のすべての要素がすでに削除されている場合がありますが、すでに「削除の準備ができている」要素についても、残りのすべての段階で計算が続行されます。
より効率的なアプローチは、各ステージを個別に実行し、入力リストを読み取り、結果を中間出力リストに保存することです。次に、ピンポンスキーマで実行を続けます。ただし、これを行うと、重要なグローバルメモリの読み取り/書き込みが生成され、さらに重要なことに、出力リストの同時書き込みを同期するatomicIncに圧力がかかります。
このような段階的なフィルタリングをどのように提案しますか?
あなたの答えと提案をありがとう。