2012-04-19 5 views
0

結果の配列を生成するカーネルがあり、これらの値の最大値を効率的に見つけたいと思います。配列は、負の値(たとえば-1)でカーネルの先頭で初期化されます。カーネルは、例えば256スレッドの5つのブロックを使用して実行されます。私は有効でないスレッドを終了する必要があり、そのため私のデータのCUDA共有メモリの最大値を見つける

  1. ので、私は時々、256スレッド、50、20などで時々働いています:

    は、ここで問題となっています。

  2. 共有メモリにはブロックからの結果が書かれていますが、私が触れたように、いくつかの配列には50の結果があり、256の結果はいくつかあります...(共有配列はこのように見えます)8,6,4,9,1、 -1、-1、-1 ...

  3. この場合、効率的に1ブロックで最大値を見つけるにはどうすればよいですか?

これらのタイプのアレイでは並列化が複雑になるでしょうか?これを行う方法 ?

+0

いいえ、私は全く新しいです:) – Hlavson

+0

'terminate'スレッドとはどういう意味ですか?そのスレッドの「返却」を行いますか?これはお勧めできません – pQB

+0

最大値(例:ArrayFire)を見つけるための空きライブラリの1つを使用することを検討しましたか? – arrayfire

答えて

2

アルゴリズムに関する情報が不十分です。

結果はどういう意味ですか? 配列の無視された値は-1に設定されていますか、または動的extern共有メモリを使用していますが、スレッドはインデックスnまで書き込むだけです(実現するのは難しい)?

  • -1に固定サイズの共有メモリとセット無視の値を使用して、正の最大値を検索し、そのと-1、それは問題ではありません満たされ、または

  • ドン場合は、まだ、並列化を行います「Tは、スレッドがさらに計算を実行し、まだ(djmjが言ったように)あなたは、あなたのカーネル内で削減を行うことができますいずれか、またはあなたが推力を使用することができ、並列化

+0

私のデータと-1をインデックスに付けて並列リダクションして解決しました。以前の計算のデータではありません:-) – Hlavson

0

を行うべきではない場合は、別の配列にフラグを設定する代わりに、スレッドを終了しますファンクタとリダクションを組み合わせる(例えばtr ansform_reduce)。推力はCUDAツールキットに含まれています。this pageのtransform_reduceの例を参照してください。