問題タブ [cuda-events]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
777 参照

cuda - cudaStreamWaitEvent はホストをブロックしますか?

イベントがトリガーされるまで cudaEventSynchronize がホストをブロックすることを理解しています。しかし、cudaStreamWaitEvent はどうでしょうか。cudaStreamWaitEvent は指定されたストリームのみをブロックしますが、ホストは続行しますか、それともホストもブロックされますか?

0 投票する
1 に答える
3233 参照

stream - cudaStreamWaitEvent は待機していないようです

私は、2 つの cuda ストリームが進行し、イベントによって管理され、互いに待機する小さなデモ プログラムを作成しようとしています。これまでのところ、このプログラムは次のようになります。

CUDA ストリームに関する私の理解は次のとおりです。ストリームは、タスクを追加できる一種のリストです。これらのタスクは連続して取り組まれます。したがって、私のプログラムでは、streamA が正常に動作することを確認できます。

  1. カーネル k_A1 を呼び出す
  2. トリガーハーフA
  3. 誰かが halfB をトリガーするのを待ちます
  4. カーネル k_A2 を呼び出す

そしてstreamBは

  1. 誰かが halfA をトリガーするのを待ちます
  2. カーネル k_B1 を呼び出す
  3. トリガーハーフB
  4. カーネル k_B2 を呼び出す

通常、両方のストリームは互いに非同期で実行される可能性があります。ただし、A1 が完了するまで streamB をブロックし、B1 が完了するまで streamA をブロックしたいと思います。

これはそれほど単純ではないようです。Tesla M2090 (CC 2.0) を搭載した私の Ubuntu では、

そして、cudaEventRecord(halfB,streamB) の前に B1 が完了することを本当に期待していたでしょう。それにもかかわらず、ストリーム A は明らかに B1 の完了を待たないため、halfB の記録も待ちません。

さらに、cudaEventRecord コマンドを完全に削除すると、プログラムが cudaStreamWait コマンドでロックダウンすることが予想されます。しかし、そうではなく、同じ出力を生成します。私はここで何を見落としていますか?

0 投票する
1 に答える
1742 参照

cuda - 後続のストリームでイベントを待機

CUDA を使用して GPU に次の種類のパイプラインを実装しようとしています。

パイプライン

Host2Device コピー、カーネル呼び出し、Device2Host コピーのそれぞれに 4 つのストリームがあります。ただし、カーネル呼び出しは、次のストリームの Host2Device コピーが完了するまで待機する必要があります。

cudaStreamWaitEvent同期に使用するつもりでした。ただし、ドキュメントによると、これcudaEventRecordは、対応するイベントに対して以前に呼び出された場合にのみ機能します。そして、これはこのシナリオには当てはまりません。

ストリームは、基本的に次のように見える個別の CPU スレッドによって管理されます。

CPU スレッドは、正しい順序でストリームを開始するように管理されます。したがって、cudaStreamWaitEventストリーム 1 のコピー完了イベントは、そのイベント (ストリーム 1) の前に (ストリーム 0 で) 呼び出されますcudaEventRecord。これにより、機能的なノーオペレーションが発生します。

イベントはこのままでは使えない気がします。目的の同期を実現する別の方法はありますか?

ところで、依存関係がいくつかあるため、ストリームの順序を逆にすることはできません。

API 呼び出し順序

リクエストに応じて、CUDA 呼び出しが発行される順序は次のとおりです。

ご覧のとおり、 への呼び出しcudaStreamWaitEventは常に への呼び出しよりも先に行われcudaEventRecordます。

0 投票する
1 に答える
435 参照

cuda - CUDA イベントの設定を解除するにはどうすればよいですか?

ホストに処理ループがあり、そこで GPU ストリームにイベントを記録します。次に、別のストリームがそのイベントを待ちます (イベントの状態が「設定」または「真」になるのを待ちます)。この関数 (cudaStreamWaitEvent) はこのイベントの設定を解除しますか (したがって、「設定解除」または「偽」に切り替えます)? そうでない場合、このイベントの設定を解除するために使用できる CUDA 関数は何ですか?

0 投票する
2 に答える
434 参照

cuda - デバイス側のコードから CUDA イベントを発生させることはできますか?

CUDA のデバイス カーネルからイベントを発生させる方法はありますか (CPU コードの cudaEvents に似た、ベンチマークの目的で)。

たとえば、カーネルの開始から計算を開始する最初のスレッドまでに経過した時間と、計算を終了した最後のスレッドから CPU が戻るまでに経過した時間を測定したいとします。

それをしてもいいですか?

0 投票する
1 に答える
1763 参照

c - CUDA でのストリームのノンブロッキング同期?

ホストをブロックせずに 2 つの CUDA ストリームを同期することは可能ですか? cudaStreamWaitEvent非ブロッキングの があることは知っています。cudaEventCreate しかし、 と を使用したイベントの作成と破棄についてはどうでしょうかcudaEventDestroy

ドキュメントcudaEventDestroyは次のように書かれています:

イベントが記録されたが、cudaEventDestroy() が呼び出されたときにまだ完了していない場合、関数はすぐに戻り、デバイスがイベントを完了すると、イベントに関連付けられたリソースが自動的に解放されます。

ここで理解できないのは、記録されたイベントと完了したイベントの違いです。また、これは、イベントがまだ記録されていない場合、呼び出しがブロックされていることを意味しているようです。

これに光を当てることができる人は誰ですか?

0 投票する
1 に答える
167 参照

cuda - cudaEventRecord は現在のデバイスの ID の影響を受けますか?

cudaEventRecordは、イベント ID とストリーム ID をパラメーターとして受け取ります。ランタイム API リファレンスには、ストリームを現在のデバイスに関連付ける必要があるかどうかは記載されていません。現在アクセスできるシステムには GPU が 1 つしかないため、そうであるかどうかをテストすることはできません。

現在のデバイス上のストリームである必要があると仮定します。

  • 別のデバイスでストリームを取得するとどうなりますか?

それが任意のデバイスのストリームであると仮定すると、次のようになります。

  • (現在のデバイスの) デフォルト ストリームの ID を取得するとどうなりますか? 結局のところ、すべてのデバイスのデフォルト ストリームが同じ (null) ID を持っているのでしょうか?
  • ストリームのデバイスが最新であるかどうかに基づいて、動作に違いはありますか?