1

parallel_for_each2つの呼び出しが連続しているC++AMPコードがあるとします。2番目の呼び出しからのラムダが始まる前に、最初の呼び出しからのすべてのラムダが完了しますか?

一般に、ラムダの実行順序についての保証はありますか?

4

2 に答える 2

3

簡単な答え:いいえ、ラムダは通常完了しません。

より長い答え:parallel_for_eachはGPUへの要求をキューに入れ、次にCPUスレッドは2番目のparallel_for_eachに進み、それをキューに入れます。その後、CPUスレッドは他のCPUコードを実行し続けます。その間、非決定論的な方法で、計算はキューに入れられたアクセラレータで実行されます(デフォルトのアクセラレータの場合、最初の計算が実行され、次に2番目の計算が実行されます)。計算の実行の間、または両方の計算の後でも、いずれかの計算の結果にアクセスしようとすると、CPUスレッドは、結果がコピーされるのを待っている間(必要に応じて待機します)、ブロックします。実行を完了します)。

(コピーをトリガーせずに)計算が完了するのを待つだけの場合は、accelerator_viewでwaitを呼び出します。

ところで、異なるparallel_for_each呼び出し間のデータ依存関係を管理する必要はありません。基盤となるランタイムがそれを行います。したがって、連続するparallel_for_each呼び出しで同じarray_Viewを使用することは問題ありません。データは、ホストCPUに戻らなくても2番目の呼び出しの準備ができています。

それでもわからない場合は、より具体的にできるように再現コードを共有してください。

C ++ AMPの詳細については、こちらから始めてください:http: //blogs.msdn.com/b/nativeconcurrency/archive/2011/09/13/c-amp-in-a-nutshell.aspx

于 2012-05-01T23:49:08.960 に答える
1

並行性ビジュアライザーを使用して、これに自分で答えることができます。キューに入れられたビューを使用している場合、コードがまだGPUで実行されていないときに、両方のpfが自分自身が完了したと見なす可能性があります(ブロックせず、戻ります)。最初の結果が終了したことを確認したい場合は、その結果を何らかの方法で使用します(たとえば、配列をCPUにコピーして戻すか、array_viewを使用します)。これにより、コードがアクセラレータで実行され始めます。

2番目のpfeを送信するまで、最初のpfeの結果に触れたり、結果を求めたりしない場合、注文の実行について保証が必要なのはなぜですか。あなたが結果に触れたり、結果を求めたりする場合、それが物事の実行方法を制御するものです。

于 2012-05-01T16:22:26.180 に答える