10

C++ で Matlab プログラムを mex 関数として書き直して速度を上げ、素晴らしい結果を得ました。この最適化の決定は非常に良いアイデアであり、スレッド化なしで最大 20 倍の速度が得られました。mex-function が何に時間を費やしていて、ボトルネックの可能性を特定したいのか、まだ興味がありました。

mex 関数をプロファイリングする方法を探しています。matlab プロファイラーはあまり役に立たず、私がダウンロードした他のプロファイラー (無料と試用版の両方) はすべて、実行可能ファイルを実行する必要があります。私は mex の第一人者ではありませんが、私が理解している限り、mex を実行する唯一の方法は Matlab 内からです。mex 関数は dll にコンパイルされますが、.mex64 と呼ばれます。したがって、この問題は dll のプロファイリングに似ているはずです。c++ mex 関数を記述するために、私はシングル ユーザー VS2005 (つまり、チーム バージョンではない) を使用し、x64 プラットフォームで実行しています。

mex 関数をプロファイリングする良い方法を知っている人はいますか? Matlab 内から開始する場合、どのツールを使用する必要があり、どのように使用すればよいですか? または、C++ コードをプロファイリングする他の方法はありますか?

4

3 に答える 3

8

私がこれを行うことができた唯一の方法は、作業を行う関数を分離し、.mat ファイルにテスト データをロードしてスタンドアロンの実行可能ファイルとして実行する別のラッパー (mexFunction の代わりに) を作成することです。これは、gprof などを使用してプロファイリングできます。

于 2009-08-14T09:51:53.227 に答える
3

VC IDE ですべてを実行する方法はありますか。「スタートアップ アプリとして Matlab を使用して、DLL Foo.dll をデバッグする」と言うことができるように。

次に、Foo.dll で使用している関数 Bar が 1 秒未満で実行される場合は、Matlab がそれを何度も呼び出すようにするか、DLL にラッパー関数を追加して何度も呼び出すようにします。

その点に到達できれば、手動のコール スタック サンプリング手法を使用できます。これは、人気がなくても、ツールのインストールが必要でなくても、実際に機能します。

于 2009-08-15T20:19:06.843 に答える
1

すでに提案されている細かい解決策に加えて、2 つの可能な解決策があります。

  1. データをロードし、mex 関数を実行してから終了するスクリプトを作成することができます。次に、プロファイラーがそのスクリプトで Matlab 実行可能ファイルを呼び出せるようにします。これは、CUDA mex 関数のプロファイリングを行っていたときに、nVidia のビジュアル プロファイラーでうまくいきました。

  2. Visual Studio で mex 関数を作成した場合は、Matlab プロセスにアタッチしてから、デバッグまたはプロファイリングのために関数を実行できるはずです。

于 2011-05-24T14:26:52.413 に答える