4

各スレッド ブロック (1 次元) が共有メモリ内の配列で他のいくつかのタスクとスキャンを実行する必要があるという問題があります。(配列には最大 1024 要素があります。)

このタイプの操作をサポートする優れたライブラリはありますか?

Thrust と CudPP をチェックしましたが、どちらもデータが最初にグローバル メモリにある場合にのみ機能します。かなり大きなオーバーヘッドがあるため、グローバルメモリ。

このタイプの操作をサポートする公開ライブラリがない場合、この操作を 1 回だけ記述して、いくつかの異なる問題で使用したい場合はどうすればよいでしょうか?

私の最初のアイデアは、スキャン操作を実行する単純なデバイス関数を作成することですが、共有メモリにアクセスして、カーネル関数ではないデバイス関数から __syncthreads() 操作を実行することは可能ですか? 私のもう1つのアイデアは、関数全体をマクロに書くことです。プリプロセッサがコードをカーネルコードにコピーするため、それは機能しますが、非常に複雑なマクロを書くことはマクロを使用する最良の方法ではありません.

PS.: ストリーミング マルチプロセッサ バージョン 2.1 を使用しているため、別のカーネルから新しいカーネルを起動できません。

4

1 に答える 1

5

このタイプの操作をサポートする優れたライブラリはありますか?

このタイプの操作をサポートする公共図書館がない場合、この操作を1回だけ記述して、いくつかの異なる問題で使用したい場合は、どうすればよいでしょうか。

CUDAUnBoundの略であるCUBという名前のライブラリがあります。ここにあります。スキャン機能を提供します。
自分で似たようなものを書きたい場合は、CUBがどのように行われるかを確認するのに役立ちます。

私の最初のアイデアは、スキャン操作を実行する単純なホスト関数を作成することですが、共有メモリにアクセスして、カーネル関数ではないデバイス関数から__syncthreads()操作を実行することは可能ですか?

「スキャン操作を実行するホスト関数」とはどういう意味かわかりません。
ホストコードから実行できるのは、カーネルとメモリのコピーを開始することだけです。問題の共有メモリを所有するブロックからデバイス関数が呼び出されない限り、答えはノーです。
共有メモリはブロックごとに割り当てられ、ブロック内からのみアクセスできます。

于 2013-03-10T11:27:16.627 に答える