問題タブ [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.
cuda - cudaStreamWaitEvent はホストをブロックしますか?
イベントがトリガーされるまで cudaEventSynchronize がホストをブロックすることを理解しています。しかし、cudaStreamWaitEvent はどうでしょうか。cudaStreamWaitEvent は指定されたストリームのみをブロックしますが、ホストは続行しますか、それともホストもブロックされますか?
stream - cudaStreamWaitEvent は待機していないようです
私は、2 つの cuda ストリームが進行し、イベントによって管理され、互いに待機する小さなデモ プログラムを作成しようとしています。これまでのところ、このプログラムは次のようになります。
CUDA ストリームに関する私の理解は次のとおりです。ストリームは、タスクを追加できる一種のリストです。これらのタスクは連続して取り組まれます。したがって、私のプログラムでは、streamA が正常に動作することを確認できます。
- カーネル k_A1 を呼び出す
- トリガーハーフA
- 誰かが halfB をトリガーするのを待ちます
- カーネル k_A2 を呼び出す
そしてstreamBは
- 誰かが halfA をトリガーするのを待ちます
- カーネル k_B1 を呼び出す
- トリガーハーフB
- カーネル k_B2 を呼び出す
通常、両方のストリームは互いに非同期で実行される可能性があります。ただし、A1 が完了するまで streamB をブロックし、B1 が完了するまで streamA をブロックしたいと思います。
これはそれほど単純ではないようです。Tesla M2090 (CC 2.0) を搭載した私の Ubuntu では、
は
そして、cudaEventRecord(halfB,streamB) の前に B1 が完了することを本当に期待していたでしょう。それにもかかわらず、ストリーム A は明らかに B1 の完了を待たないため、halfB の記録も待ちません。
さらに、cudaEventRecord コマンドを完全に削除すると、プログラムが cudaStreamWait コマンドでロックダウンすることが予想されます。しかし、そうではなく、同じ出力を生成します。私はここで何を見落としていますか?
cuda - 後続のストリームでイベントを待機
CUDA を使用して GPU に次の種類のパイプラインを実装しようとしています。
Host2Device コピー、カーネル呼び出し、Device2Host コピーのそれぞれに 4 つのストリームがあります。ただし、カーネル呼び出しは、次のストリームの Host2Device コピーが完了するまで待機する必要があります。
cudaStreamWaitEvent
同期に使用するつもりでした。ただし、ドキュメントによると、これcudaEventRecord
は、対応するイベントに対して以前に呼び出された場合にのみ機能します。そして、これはこのシナリオには当てはまりません。
ストリームは、基本的に次のように見える個別の CPU スレッドによって管理されます。
CPU スレッドは、正しい順序でストリームを開始するように管理されます。したがって、cudaStreamWaitEvent
ストリーム 1 のコピー完了イベントは、そのイベント (ストリーム 1) の前に (ストリーム 0 で) 呼び出されますcudaEventRecord
。これにより、機能的なノーオペレーションが発生します。
イベントはこのままでは使えない気がします。目的の同期を実現する別の方法はありますか?
ところで、依存関係がいくつかあるため、ストリームの順序を逆にすることはできません。
API 呼び出し順序
リクエストに応じて、CUDA 呼び出しが発行される順序は次のとおりです。
ご覧のとおり、 への呼び出しcudaStreamWaitEvent
は常に への呼び出しよりも先に行われcudaEventRecord
ます。
cuda - CUDA イベントの設定を解除するにはどうすればよいですか?
ホストに処理ループがあり、そこで GPU ストリームにイベントを記録します。次に、別のストリームがそのイベントを待ちます (イベントの状態が「設定」または「真」になるのを待ちます)。この関数 (cudaStreamWaitEvent) はこのイベントの設定を解除しますか (したがって、「設定解除」または「偽」に切り替えます)? そうでない場合、このイベントの設定を解除するために使用できる CUDA 関数は何ですか?
cuda - デバイス側のコードから CUDA イベントを発生させることはできますか?
CUDA のデバイス カーネルからイベントを発生させる方法はありますか (CPU コードの cudaEvents に似た、ベンチマークの目的で)。
たとえば、カーネルの開始から計算を開始する最初のスレッドまでに経過した時間と、計算を終了した最後のスレッドから CPU が戻るまでに経過した時間を測定したいとします。
それをしてもいいですか?
c - CUDA でのストリームのノンブロッキング同期?
ホストをブロックせずに 2 つの CUDA ストリームを同期することは可能ですか? cudaStreamWaitEvent
非ブロッキングの があることは知っています。cudaEventCreate
しかし、 と を使用したイベントの作成と破棄についてはどうでしょうかcudaEventDestroy
。
のドキュメントにcudaEventDestroy
は次のように書かれています:
イベントが記録されたが、cudaEventDestroy() が呼び出されたときにまだ完了していない場合、関数はすぐに戻り、デバイスがイベントを完了すると、イベントに関連付けられたリソースが自動的に解放されます。
ここで理解できないのは、記録されたイベントと完了したイベントの違いです。また、これは、イベントがまだ記録されていない場合、呼び出しがブロックされていることを意味しているようです。
これに光を当てることができる人は誰ですか?
cuda - cudaEventRecord は現在のデバイスの ID の影響を受けますか?
cudaEventRecordは、イベント ID とストリーム ID をパラメーターとして受け取ります。ランタイム API リファレンスには、ストリームを現在のデバイスに関連付ける必要があるかどうかは記載されていません。現在アクセスできるシステムには GPU が 1 つしかないため、そうであるかどうかをテストすることはできません。
現在のデバイス上のストリームである必要があると仮定します。
- 別のデバイスでストリームを取得するとどうなりますか?
それが任意のデバイスのストリームであると仮定すると、次のようになります。
- (現在のデバイスの) デフォルト ストリームの ID を取得するとどうなりますか? 結局のところ、すべてのデバイスのデフォルト ストリームが同じ (null) ID を持っているのでしょうか?
- ストリームのデバイスが最新であるかどうかに基づいて、動作に違いはありますか?