concurrency::array_view
ループで操作されている場合concurrency::parallel_for_each
、ループの実行中に CPU で他のタスクを続行できると理解しています。
using namespace Concurrency;
array_view<int> av;
parallel_for_each(extent<1>(number),[=](index<1> idx)
{
// do some intense computations on av
}
// do some stuff on the CPU while we wait
av.synchronize(); // wait for the parallel_for_each loop to finish and copy the data
しかし、並列 for ループを待つのではなく、できるだけ早くGPU からデータのコピーを開始したい場合はどうすればよいでしょうか。以下は機能しますか?
using namespace Concurrency;
array_view<int> av;
parallel_for_each(extent<1>(number),[=](index<1> idx)
{
// do some intense computations on av
}
// I know that we won't be waiting to synch when I call this, but will we be waiting here
// until the data is available on the GPU end to START copying?
completion_future waitOnThis = av.synchronize_asynch();
// will this line execute before parallel_for_each has finished processing, or only once it
// has finished processing an the data from "av" has started copying back?
completion_future.wait();
The Mothでこのトピックについて読みましたが、以下を読んだ後、私は本当に賢明ではありません。
parallel_for_each は呼び出し元のコードと同期しているかのように実行されますが、実際には非同期であることに注意してください。つまり、parallel_for_each 呼び出しが行われ、カーネルがランタイムに渡されると、some_code_B 領域は CPU スレッドによってすぐに実行され続けますが、並行して、カーネルは GPU スレッドによって実行されます。ただし、some_code_B 領域のラムダでキャプチャした (array または array_view) データにアクセスしようとすると、結果が利用可能になるまでコードがブロックされます。したがって、正しいステートメント: parallel_for_each は、目に見える副作用の点ではあたかも同期ですが、実際には非同期です。