1

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 は、目に見える副作用の点ではあたかも同期ですが、実際には非同期です。

4

1 に答える 1