推力::device_vectorの自動メモリ管理は本当に便利です。唯一の欠点は、カーネルコード内からそれを使用できないことです。
インターネットを調べたところ、ホストコードからデバイスメモリを処理するthrustなどのベクターライブラリが見つかりました。カーネル用のベクターライブラリはありますか?そうでない場合は、そのようなライブラリを用意するのは悪い考えですか?
このようなライブラリを作成することは可能ですが、非常に非効率的です。
実際、thrust :: device_vectorは、ホストではなくデバイスにメモリを割り当てるという点で、thrust::host_vectorまたはstd::vectorとのみ異なります。サイズ変更アルゴリズムは同じで、ホスト上で実行されます。
サイズ変更ロジックは非常に単純ですが、メモリの割り当て/解放とデータのコピーが含まれます。マルチスレッド設定では、スレッドがサイズを変更するたびにベクトル全体をロックする必要があります。これは、コピーのために非常に長くなる可能性があります。
ベクトルに要素を追加するカーネルの場合、一度に1つのスレッドのみがサイズ変更を許可されるため、同期メカニズムは実際に作業をシリアル化します。したがって、コードは、(非常に大きな)同期オーバーヘッドを差し引いた単一のデバイスプロセッサの速度で実行されます。これはおそらくCPUの実装よりもかなり遅いでしょう。
スラストはカーネル内では使用できませんが、カーネルthrust::device_vector
とのインターフェースまで使用できます。その時点で、基になるデータへのポインターをカーネルに渡すことができます。例えば:
thrust::device_vector<int> my_int_vector;
my_kernel<<<blocks, threads>>>(thrust::raw_pointer_cast(my_int_vector.data());
状況によっては、これは、独自のカーネルを実装する場合でも、Thrustライブラリが役立つことを意味する場合があります。