0

私は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

VisionWorks - エッジヒステリシスローカル

だから、私の質問は、

  • 分析から、さまざまなパフォーマンスの原因について何がわかりますか?

  • さらに、一般的に CUDA アプリケーションのプロファイリングを行う場合、どこから始めるのが適切でしょうか? つまり、たくさんのメトリクスがあり、何を見ればよいかを判断するのは非常に困難です。

  • 一般的な CUDA アプリケーションのプロファイリングに関する教材はありますか? (私は NVIDIA からの多くのスライドを見ましたが、それらは一般的にどこから始めるべきかではなく、メトリックの定義を伝えているだけだと思います。)

-- ちなみに、私の知る限り、NVIDIA は VisionWorks と OpenCV4Tegra のソース コードを提供していません。私が間違っている場合は修正してください。

ご回答ありがとうございます。

4

1 に答える 1