問題タブ [nvvp]
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.
profiling - NVIDIA GPU を使用した Windows での OpenCL アプリケーションのプロファイリング
手伝って頂けますか?Windows 7 x64 で OpenCL アプリケーションを開発しています。ハードウェアは Intel Core i5、NVIDIA GTX 770 です。OpenCL はアクセラレーションに NVIDIA を使用します。
インテル VTune Amplifier XE 2015 を使用しようとすると、プロファイリングの最後でアプリケーションがハングし、レポートが返されません。ドキュメントでは、すべての「Cn(ACPI Cn) report to OS」BIOS オプションを無効にすることを推奨しています。しかし、このハングを回避するためにアプリケーション コードを変更する方法はまったく不明です。
また、このマニュアルを使用して NVVP を利用しようとしましたhttps://github.com/UoB-HPC/UoB-HPC.github.io/blob/master/_posts/2015-05-27-nvvp-import-opencl.md . 残念ながら、プロファイラーはエラーを生成します: アプリケーションをプロファイリングできません。「別の CUDA ツール (プロファイラー、デバッガー、memcheck) が現在実行されているため、アプリケーションをプロファイリングできません」。このエラーは、NVVP のみが実行されている場合にも表示されます。
cuda - 「まれな理由でカーネルがブロックされました」 - これらの理由は何ですか?
nvvp CUDA プロファイラー フロントエンドは、次の命令の実行を待っているワープの原因を分析します。「実行レイテンシー」、「メモリー依存性」、「テクスチャー依存性」などのカテゴリーと、「その他」という名前のカテゴリーがあります。
円グラフの凡例は次のように述べています。
その他 - 「[n] 珍しい理由でカーネルがブロックされました」
私の質問:
- これは、プロファイラーが実行がブロックされた理由を理解できないということですか、それとも単に「一般的でない理由」を集計しているだけなのでしょうか?
- より「一般的で珍しい」理由は何ですか? ご覧のとおり、場合によっては無視できない場合もあります。
- すべての「一般的でない理由」のリストはどこかにありますか?
parallel-processing - NVIDIA Visual Profiler の分析/推奨事項を解釈する方法は?
私はCUDAに比較的慣れておらず、現在、GPUが接続された組み込みシステム(NVIDIA TX1)でコンピュータービジョンアプリケーションを高速化するプロジェクトに取り組んでいます。私がやろうとしているのは、OpenCV と VisionWorks (OpenVX を含む) の 2 つのライブラリから選択することです。
現在、Canny Edge Detection アルゴリズムを実行するテスト コードを作成しましたが、2 つのライブラリの実行時間は異なっていました (VisionWorks の実装にかかる時間は約 30 ~ 40% 短縮されています)。
その理由は何だろうと思い、最も時間がかかっているカーネルをプロファイリングしました: OpenCV4Tegra の 'canny::edgesHysteresisLocalKernel' で、アプリケーション全体の 37.2% を占めています (OpenCV 実装と VisionWorks 実装の両方から)。 VisionWorks の「edgesHysteresisLocal」。
私は「ガイド付き分析」に従い、プロファイラーは、アプリケーションが両方ともレイテンシーバウンドであることを示唆しました。以下は、VisionWorks の「edgesHysteresisLocal」と OpenCV4Tegra の「canny::edgesHysteresisLocalKernel」のキャプチャです。
OpenCV4Tegra - canny::edgesHysteresisLocalKernel
だから、私の質問は、
分析から、さまざまなパフォーマンスの原因について何がわかりますか?
さらに、一般的に CUDA アプリケーションのプロファイリングを行う場合、どこから始めるのが適切でしょうか? つまり、たくさんのメトリクスがあり、何を見ればよいかを判断するのは非常に困難です。
一般的な CUDA アプリケーションのプロファイリングに関する教材はありますか? (私は NVIDIA からの多くのスライドを見ましたが、それらは一般的にどこから始めるべきかではなく、メトリックの定義を伝えているだけだと思います。)
-- ちなみに、私の知る限り、NVIDIA は VisionWorks と OpenCV4Tegra のソース コードを提供していません。私が間違っている場合は修正してください。
ご回答ありがとうございます。
cuda - CUDAポインタ演算により、結合されていないメモリアクセスが発生しますか?
ポインターからポインターへの操作が必要な CUDA カーネルを使用しています。カーネルは基本的に、多数の非常に小さいリダクションを実行します。リダクションのサイズは Nptrs=3 ~ 4 であるため、シリアルで実行するのが最適です。カーネルの 2 つの実装を次に示します。
名前が示すように、カーネル「sepderef」は対応するものよりも約 40% 高速に実行され、起動オーバーヘッドを計算に入れると、ECC がオンの M2090 で Nptrs=3、Nx=60000 で約 85GBps の有効帯域幅を達成します (~160GBps最適でしょう)。
これらを nvvp で実行すると、カーネルが帯域幅に制限されていることがわかります。しかし、奇妙なことに、//FLAGGED とマークした行は、最適化されていないメモリ アクセスの領域としてプロファイラーによって強調表示されます。ここでのアクセスが合体しているように見えるので、これがなぜなのかわかりません。なぜそうではないでしょうか?
編集:これを指摘するのを忘れていましたが、//FLAGGED 領域は、算術演算を行ったポインターにアクセスしているのに対し、他の領域は角かっこ演算子を使用してアクセスしていることに注意してください。