0

結果値の配列を生成するカーネルがあり、これらの値の最大値を効率的に見つけたいと考えています。配列は、カーネルの先頭で負の値 (-1 など) で初期化されます。カーネルは、たとえば、それぞれ 256 スレッドの 5 つのブロックを使用して実行されます。

問題は次のとおりです。

  1. 私のデータのため、無効なスレッドを終了する必要があります。そのため、256 スレッド、場合によっては 50、20 などで作業しています。

  2. 共有メモリにはブロックからの結果が書き込まれますが、前述のように、50 個の結果を持つ配列もあれば、256 個の結果を持つ配列もあります...(共有配列は次のようになります) 8,6,4,9,1,-1,-1 、-1...

  3. その場合、1つのブロックで最大値を効率的に見つける方法は?

これらのタイプの配列では、並列リダクションは複雑になりますね。これを行う方法 ?

4

2 に答える 2

2

アルゴリズムに関する十分な情報がありません。

n 件の結果とはどういう意味ですか? 配列内の無視された値は -1 に設定されていますか、それとも動的な extern 共有メモリを使用し、スレッドはインデックス n までしか書き込みませんか?

  • 固定サイズの共有メモリを使用し、無視された値を -1 に設定しても並列削減を実行します。正の最大値を検索し、-1 で満たされている場合は問題ありません。または、

  • スレッドを終了せず、スレッドがそれ以上計算を実行せず、並列リダクションを実行する必要がある場合は、代わりに別の配列にフラグを設定します

于 2012-04-19T12:33:45.620 に答える
0

(djmjが言ったように)カーネル内でリダクションを行うか、スラストを使用してファンクターとリダクションを組み合わせることができます(例:transform_reduce)。Thrust は CUDA Toolkit に含まれています。transform_reduceの例については、このページを参照してください。

于 2012-04-19T15:57:50.983 に答える