3

フロートの大規模な配列、可能な数百万のセル、およびこれ以上作業を行うことができない状態に達するまでこのデータを操作するアルゴリズムがあります。これらの float の 1 つが 0 より大きい場合、ブール値を true に設定してからホストに渡す必要があります。これは、カーネルを再度実行するようにスケジュールする必要があることを意味します。計算を行うセルごとに作業項目があります。これまでのところ、配列全体で 2 段階の |= リダクションを使用することを検討してきましたが、これが適切な方法と思われます。別の非常に遅い方法は、アトミック操作を使用することです。

ワークアイテムが何らかの作業を行う場合にのみ特定の値を設定し、それ以外の場合はそのままにしておきたいので、アトミックを使用せずにすべてのワークグループのすべてのワークアイテムで変更できるグローバルブール値を渡しても、意図したことを達成できますか?効果?このブール値が false に初期化され、ワー​​クアイテムによってのみ true に設定できると仮定すると、間違った結果が得られる可能性はありますか? これは悪い考えですか? もしそうなら、なぜですか?

4

1 に答える 1

3

興味深い質問です。

ワークアイテムが何らかの作業を行う場合にのみ特定の値を設定し、それ以外の場合はそのままにしておきたいので、アトミックを使用せずにすべてのワークグループのすべてのワークアイテムで変更できるグローバルブール値を渡しても、意図した効果?

この提案はうまくいくと思いますし、おそらく最も効率的な解決策です。ただし、次の 2 つの注意事項があります。

  • カーネルにはif (condition) shouldContinue = 1and notのようなものを含める必要があることに注意してください。shouldContinue = condition後者の方がパフォーマンスが優れていても、順序を制御できないため、メモリに 0 を格納しないようにする必要があります。

  • メモリを明示的にオーバーライドしboolたいので、システムがストアの前に単語全体をロードする必要がないことを確認したいので、私は を使用しません。実際、ハードウェアとコンパイラがそれをサポートしていると仮定すると、コンパイラがここで非一時的なストアを使用できるようにするのに十分な大きさの型を使用します-たとえば、キャッシュライン全体を占める型を使用します。としてint16、何らかの値に設定します。

于 2013-06-06T11:58:20.100 に答える