2017-07-11 15 views
0

CUDAの特定のメモリ命令またはコードラインのメモリ帯域幅を測定する方法はありますか? (nvprofはカーネル全体のメモリ帯域幅を出力することができます)。clock()関数が唯一の方法であれば、帯域幅を計算する式は何ですか? ({命令またはコード行ごとの合体アドレスの数}をクロック()の差で割ったもの)CUDAの特定の命令またはコードラインのメモリ帯域幅を測定する方法はありますか?

特定の命令またはコード行がメモリ帯域幅を超えているかどうかを確認したいと思います。 (ex、MSHR ..)

x86_64ビットLinuxシステムにGTX980(Maxwell、sm_52)とP100(Pascal、sm_60)という2つのデバイスがあります。

+2

これは多くの理由でこれが意味をなさないとは確信していません。恐らく最も重要なのは、LD(SASS)命令が火災と忘却の命令であるということです。つまり、LD/STユニットに発行されただけです。*その結果、メモリトランザクションが発生する可能性があります。単にLD命令の "持続時間"を測定しただけであれば、その命令をLD/STユニットに発行するのにかかる時間を測定しているだけです。これは非常に短く、正確に測定できれば数サイクルです。実際にデータを取得するのにかかる時間を表すものではありません。 –

+1

命令やコードの行(特にLD/ST命令ではありません)のメモリ帯域幅などはありません。これは、他の命令と並行して並行して実行されます。また、@ RobertCrovellaが言ったように、 'clock()'を使うことで必要なものを手に入れることができません。おそらく、もしあなたがこの値で答えようとしている質問を説明できたら? – einpoklum

答えて

2

nsightツールでは、命令レベルのプロファイリングが役立ちます。それはあなたがSMが "ストール"するとき(何らかの指示を出すことができないとき)、どのラインを非難すべきかのアイデアを与えることができる。 LD/ST命令は実行をブロックしないので、しばしばストールがの後に続き、のデータがフェッチされます。

トピックに関するNVIDIAのデベロッパーはこちらです。 https://devblogs.nvidia.com/parallelforall/cuda-7-5-pinpoint-performance-problems-instruction-level-profiling/

2

nvidiaの視覚プロファイラを使用します。多かれ少なかれ、それはあなたのcudaコードのパフォーマンスについて知ることができるすべてを教えてくれます。

コードを-lineinfoでコンパイルすると、プロファイラはカーネルの各行の統計情報を表示できます。コードを実行するときは、無ガイド分析(デフォルトのレイアウトの左下)に切り替えます。タイムラインを生成させ、タイムラインで必要なカーネルをクリックし、左下パネルのグローバルメモリアクセスパターンの再生ボタンをクリックします。それはトランザクション/アクセスと、理想的な数が何であるかを知らせるだけでなく、グローバルメモリ負荷の行ごとのリストを思い付くでしょう。これらの行のいずれかをダブルクリックすると、ソースコードの行に移動し、一致するアセンブリ命令を表示します。

関連する問題