問題タブ [cuda-streams]

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 に答える
205 参照

cuda - カーネルの同時実行における CUDA グローバル アトミック操作

私の CUDA アプリケーションは、ボリュームに対して連想削減を実行します。基本的に、各スレッドは、グローバル メモリ内の同じ出力バッファのオーバーラップする場所に原子的に追加される値を計算します。

異なる入力パラメーターと同じ出力バッファーを使用して、このカーネルを同時に起動することはできますか? つまり、各カーネルは同じグローバル バッファを共有し、アトミックに書き込みます。

すべてのカーネルが同じ GPU で実行されています。

0 投票する
0 に答える
801 参照

machine-learning - PyTorch を使用してモデルのフォワード パスと並行して別のモデルを実行する

PyTorch の ResNet-18 モデルにいくつかの変更を加えて、各 ResNet ブロックの最後にある ResNet 中間層出力を入力として取り込み、推論中にいくつかの補助予測を行う別の補助トレーニング モデルの実行を呼び出そうとしています。フェーズ

GPU でのパイプライン実行全体のエンドツーエンドのレイテンシを削減するために、次の ResNet ブロックの計算と並行してブロックの計算の後に補助計算を実行できるようにしたいと考えています。

機能の観点からは正しく動作する基本コードがありますが、補助モデルの実行は ResNet ブロックの計算と連続しています。これを2つの方法で確認しました-

  1. print ステートメントを追加し、実行順序を検証します。

  2. 元の ResNet モデルの実行時間 (時間 t1 とします) と補助モデル (時間 t2 とします) を計測します。私の実行時間は現在 t1+t2 です。

元の ResNet ブロック コード (ResNet-18 で実験しているため、これは BasicBlock です)。コード全体はこちらから入手できます

これはシリアル方式で動作する私の修正です -

当然のことながら、上記のコードにより、補助モデルの実行と次のブロックの間でデータの依存関係が発生するため、物事が連続して発生します。私が最初に試した解決策は、このデータ依存関係を解消することでレイテンシが減少するかどうかを確認することでした。補助モデルの実行を許可し、条件が満たされた場合にauxiliary_predictionを返さないことでそうしようとしました(これは機能を壊しますが、この実験は純粋に動作を理解するためのものでした). 本質的に、私がしたことは -

ただし、これは機能せず、さらに調査したところ、この Stack Overflow リンクで CUDA ストリームを見つけました。以下の方法で問題を解決するために、CUDAストリームのアイデアを取り入れてみました-

ただし、Nvidia Visual Profiler からの出力は、すべての作業がまだデフォルト ストリームで実行され、シリアル化されていることを示しています。私が使用しているCUDAバージョンでCUDAストリームがサポートされていることを小さなCUDAプログラムで確認したことに注意してください。

私の質問 -

  1. データの依存関係を壊しても、PyTorch が計算を並列にスケジュールしないのはなぜですか? これが PyTorch の動的計算グラフのポイントだと思いました。

  2. CUDA ストリームを使用しても計算がデフォルト以外のストリームに委譲されないのはなぜですか?

  3. 補助モデルを ResNet ブロック計算と非同期/並列に実行する別の方法はありますか?