1

変数 x があるとします。

x = 0

次に、いくつかのスレッドを生成します。各スレッドは、アトミックを使用せずに次の式を実行する場合と実行しない場合があります。

x |= 1

すべてのスレッドがメイン スレッドに参加した後、メイン スレッドは値で分岐します。

if(x) { ... } else { ... }

この状況で競合状態が発生する可能性はありますか? 'x' の読み取りと書き込みの間に、スレッドが別のスレッドによって中断されるかどうかは問題ではないように思われるため、私の考えではノーと言います (どちらの場合も、'x == 1' または 'x == 1' のいずれか)。 )。とはいえ、ばかげた明白なものやばかげて微妙なものを見逃していないことを確認したいと思います。

また、反対の回答をした場合は、命令ごとの例を提供してください。

コンテキスト:私は、OpenCL で、自分のスレッドがその作業項目の で機能の有無を示すようにしようとしています。いずれかのスレッドが機能の存在を示している場合、私のホストは結果に基づいて分岐できるはずです。上記の方法を考えています。より良い提案があれば、それもうまくいきます!

詳細: データがバンド化されている場合に基数パスをスキップするために、OpenCL の基数ソート実装に早期終了を追加しようとしています (つまり、上記の 'x' は x[RADIX] になり、すべてのワーク グループが必要になります)。データを部分的に縮小した後、RADIX ビン内の要素の有無を「x」で示します)。

4

1 に答える 1

0

ワークグループ内で機能する場合があります。x をテストする前にバリアを挿入する必要があります。アトミックインクリメントを使用するよりも高速になるかどうかはわかりません。

複数のワークグループ間では機能しません。20 コアで実行する 1000 のワークグループがあるとします。通常、1 つのコアに常駐できるワークグループの数は少数 (たとえば 4 つ) に限られます。つまり、特定の時間に GPU 内で実行できるワークグループは 80 だけです。ワークグループの実行が完了すると、それは廃止され、別のワークグループが開始されます。実行の途中でカーネルを停止して、1000 のワークグループすべてが同じポイントに到達するのを待つことは不可能です。

于 2013-03-25T17:12:48.467 に答える