問題タブ [nvprof]
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 - nvvp (ビジュアル) と nvprof (コマンドライン) の出力に違いはありますか?
CUDA プログラムのメトリック/イベントを測定するために、次のようなコマンド ラインを使用してみました。
Visual プロファイラーでも同じ指標を測定しましたnvvp
。得られる値に違いはありませんでした。
のようなメトリックを選択すると、出力の違いに気付きましたachieved_occupancy
。nvvp
しかし、これは実行ごとに異なるため、またはを使用しているかどうかに関係なく、実行するたびに異なる結果が得られるのはおそらくそのためですnvprof
。
質問:
nvvp
とnvprof
はまったく同じで、使いやすさのために のnvvp
上に構築された GUI に過ぎないという印象を受けました。nvprof
しかし、私はこのアドバイスを与えられました:
常にビジュアル プロファイラーを使用してください。コマンドラインは絶対に使用しないでください。
また、この質問は次のように述べています。
グローバルなロード/ストア効率、リプレイ、DRAM 使用率が必要なため、コマンド ライン プロファイラーは使用したくありません。これらはビジュアル プロファイラーでより明確に表示されます。
のような「動的な」指標を除けばachieved_occupancy
、結果の違いに気づいたことはありません。それで、このアドバイスは有効ですか?nvprof
働き方になんらかの不備があるのでしょうか。コマンド ライン フォームよりもビジュアル プロファイラーを使用する利点があれば教えてください。
より具体的には、nvprof
間違った結果をもたらすメトリクスはありますか?
ノート:
cuda - nvprof がデータを返さない原因は何ですか?
OpenACC を備えた Fortran MPI コードがあります。ビッグコードです。ここで意味のあるスニペットを提供することはできません。Cray aprun で問題なく動作します:
nvprof でプロファイリングしたい。私は試します:
コードは再び正常に実行されますが、すべてが完了したら、プロファイリング データは取得されず、メッセージのみが表示されます。
他にエラー メッセージは表示されません。何がこの動作を引き起こすのか誰にも分かりますか? Cray MPI Fortran コンパイラでコンパイルしています。私のコンパイルフラグは
cudatoolkit
モジュールがロードされます。
cuda - 帯域幅の nvprof オプション
コマンドラインから nvprof --metrics を使用して帯域幅を測定するための正しいオプションはどれですか? ピーク FLOPS のパーセンテージを取得するために flop_dp_efficiency を使用していますが、マニュアルには帯域幅測定のオプションがたくさんあるようで、何を測定しているのかよくわかりません。たとえば、dram_read、dram_write、gld_read、gld_write はすべて同じように見えます。また、両方が同時に発生すると仮定して、帯域幅を読み取り+書き込みスループットの合計として報告する必要がありますか?
編集:
図の優れた回答に基づいて、デバイスメモリからカーネルへの帯域幅はどうなりますか? カーネルからデバイス メモリへのパスの帯域幅 (読み取り + 書き込み) を最小限に抑えることを考えています。これはおそらく L2 キャッシュへのドラムです。
FLOPS と帯域幅を測定することにより、カーネルが計算またはメモリにバインドされているかどうかを判断しようとしています。
cuda - 合体メモリ アクセス時のグローバル ロード トランザクション数
nvidia gtx980カードで、トランザクション数を観察することにより、結合されたメモリアクセスをテストするための簡単なカーネルを作成しました。カーネルは、
次のカーネル構成でこれを実行すると
カーネル内のデータ アクセスは完全に統合されており、データ型は float (4 バイト) であるため、予想されるロード/ストア トランザクションの数は次のようになります。
ロード トランザクション サイズ = 32 バイト
トランザクションごとにロードできる float の数 = 32 バイト / 4 バイト = 8
10240 のデータをロードするのに必要なトランザクション数 = 10240/8 = 1280 トランザクション
データの書き込みにも同じ量のトランザクションが予想されます。
しかし、nvprof メトリックを観察すると、以下の結果が得られました
データのロードに必要なトランザクションの 2 倍が必要な理由がわかりません。しかし、ロード/ストアの効率に関しては、両方のメトリックが 100% を示します
ここで何が欠けていますか?
cuda - CUDA における Warp あたりの命令数に対するデータ サイズの関係
データ型のサイズが変わったときにカーネルで実行される命令の数を調べてみました
カスタムサイズのデータ構造を取得するために、次のように構造体を作成しました。
そして、上記のデータ型配列をある配列から別の配列にコピーするためだけにカーネルを作成しました
次に、単一のブロックで 32 スレッドのみに対して上記のカーネルを呼び出しました
を使用してプログラムをプロファイリングし、nvprof
をチェックするinstructions per warp
と、 の値の変化に伴ってパラメータ値が変化することがわかりましたDATABYTES
。
私の質問は、この命令数の増加の理由がfloatArray
構造体内の配列によるものかどうかです。a
カーネルでコピーを呼び出すと、構造体内の配列の各要素が実際に展開およびコピーされfloatArray
、より多くの命令が作成されるためです。
単一の命令を使用してカーネル内のカスタム構造体変数をコピーする方法はありますか?
cuda - GPU メモリに現在存在するエンティティを確認する
cudaMalloc() で割り当てられたエンティティ (およびそのサイズ) が現在 GPU デバイスに存在することを確認する最も簡単な方法は何でしょうか? 関数内のメモリ リークを見つけたいのですが、関数が 1 回だけ呼び出されて終了した場合はメモリ リークはありませんが (cuda-memcheck でチェック)、複数回呼び出された場合はメモリ フットプリントがどんどん大きくなります。
Nsight Visual Profiler は私が尋ねるには複雑すぎるようで、cuda-memcheck はリークを検出しませんでした!
cuda - CUDA プログラムのコード内プロファイリングはありますか
OpenCL の世界には、キューに入れられた、送信された、開始および終了時間などのイベントのすべてのプロファイリング情報をナノ秒単位で返す関数clGetEventProfilingInfoがあります。printf
いつでもその情報にアクセスできるのでとても便利です。
たとえば、PyOpenCLを使用すると、次のようなコードを書くことができます。
これは私の仕事にとって非常に有益です。
nvprofやcompanyなどの外部プロファイリング ツールを使用する代わりに、コードでそのような情報を取得することは可能ですか?