C++ コードから MATLAB 関数 (dll) を呼び出します。この関数は、配列をパラメーターとして取得します。関数は、配列の各メンバーに対して何らかの計算を行います。私は2つのテストをしました。初めて、24 個の要素を持つ配列でこの関数を呼び出しました。2 回目は、この関数を 8 つの要素で 3 回呼び出しました。2 番目のテストには 2 倍の時間がかかりました。なんで ?MATLAB 関数の入力と終了に時間がかかりますか? はいの場合、なぜですか?
1 に答える
お気付きのように、MEX 関数を呼び出すにはかなりの時間がかかります。Matlab がしなければならない最低限のことを考えてみましょう:
- Matlab パスをスキャンして、関数が MEX ファイルにマップされていること (および MEX ファイルが変更されていないこと) を確認します。
- DLL または共有ライブラリから MEX 関数を読み込み、その
mexFunction
シンボルを解決します。 - 入力パラメータと出力パラメータの配列を割り当てて初期化する
- 関数を呼び出す
- MEX 関数が読み込んだ一時変数を探して解放します
- 入力パラメータと出力パラメータの配列を解放します
理論的には、Matlab はキャッシングを使用して最初の 2 つの手順を回避できます。しかし、そうかどうかはわかりません。以降のステップはどれもスキップできず、Matlab インタープリター (またはその JIT コンパイラー) によって実際に最適化されることさえありません。基本的に、計算が高速な場合、実際に実行するよりも MEX 関数の呼び出しに多くの時間を費やすことになります。
MEX のパフォーマンスを最大化する方法は既に見つかりました。これは、MEX 関数が各呼び出しで可能な限り多くのことを行うようにすることです。
各呼び出しで可能な限り多くのデータを処理するだけでなく、単純な外部ループも MEX 関数にプッシュする必要があります。単純なループは、MEX 関数で簡単に実装できます。また、Matlab (JIT コンパイルされた Matlab でさえも) のループよりも高速であり、MEX 関数を繰り返し呼び出すコストを回避します。
関数の賢明な使用mexLock
が役立つかどうかも確認できます。で MEX 関数のロックを解除する何らかの方法を提供する必要があります。そうしないとmexUnlock
、メモリ リークが発生する可能性があり、MEX 関数を変更するたびに Matlab セッションを再起動する必要があります。