5

ブロッキングとcudaMemcpyについて見たいくつかのコメントに混乱しています。Fermi HWは、カーネルの実行とcudaMemcpyの実行を同時に実行できることを理解しています。

Lib func cudaMemcpy()がブロッキング関数であることを読みました。これは、コピーが完全に完了するまで、funcがそれ以上の実行をブロックすることを意味しますか?またはこれは、前のカーネルが終了するまでコピーが開始されないことを意味しますか?

たとえば、このコードは同じブロッキング操作を提供しますか?

SomeCudaCall<<<25,34>>>(someData);
cudaThreadSynchronize();

vs

SomeCudaCall<<<25,34>>>(someParam);
cudaMemcpy(toHere, fromHere, sizeof(int), cudaMemcpyHostToDevice);
4

2 に答える 2

7

あなたの例は同等です。非同期実行が必要な場合は、ストリームまたはコンテキストとcudaMemcpyAsyncを使用して、実行とコピーをオーバーラップさせることができます。

于 2012-07-23T19:49:07.900 に答える
5

NVIDIAプログラミングガイドによると:

ホストとデバイス間の同時実行を容易にするために、一部の関数呼び出しは非同期です。デバイスが要求されたタスクを完了する前に、制御がホストスレッドに返されます。これらは:

  • カーネルが起動します。
  • メモリは、2つのアドレス間で同じデバイスメモリにコピーします。
  • ホストからデバイスへの64KB以下のメモリブロックのメモリコピー。
  • 接尾辞がAsyncである関数によって実行されるメモリコピー。
  • メモリセット関数呼び出し。

転送サイズが64KBより大きい限り、例は同等です。

于 2013-04-12T09:21:04.113 に答える