5

CUDA/Thrust/CUDPP を使用しています。私が理解しているように、ストリーム圧縮では、配列内の特定の項目が無効としてマークされ、「削除」されます。

では、ここでの「削除」とは実際には何を意味するのでしょうか。元の配列のA長さが 6 であると仮定します。2 つの要素が無効である場合 (どのような条件を指定しても)、次のようになります。

  1. システムは GPU メモリにサイズ 4の新しい配列を作成し、有効な要素を格納して最終結果を取得しますか?

  2. または、メモリから無効な要素を物理的に削除し、有効な要素のみを保持して元の配列 A をサイズ 4 に縮小しますか?

どちらの場合も、内部で動的メモリ割り当てが行われているということではないでしょうか? しかし、CUDA の世界では動的メモリ割り当てができないと聞いていました。

4

1 に答える 1

4

まず、Compute Capability 2.0 以降のデバイスでは、CUDA で動的メモリ割り当てが可能です。CUDA ランタイム ライブラリは、関数内で malloc/free および new/delete をサポートし__device__ます。しかし、それは答えに密接に関係していません。

通常、十分な大きさの出力配列が提供され (事前に割り当てられ、多くの場合、入力配列と同じサイズ)、出力がそれに書き込まれます。動的割り当ては必要ありませんが、ストレージが無駄になる可能性があります。これが、CUDPP と推力が行うことです。別の方法として、最初に有効な要素のカウントを実行してから、ホスト CPU から呼び出された cudaMalloc を使用して出力 GPU メモリを動的に割り当てることもできます。

于 2011-12-06T07:13:13.737 に答える