22

Matlab mex プログラムと対応する Matlab インターフェイスのない C プログラムとの速度の違いを説明 (および回避) するのに途方に暮れています。私は数値解析プログラムのプロファイリングを行ってきました:

int main(){

Well_optimized_code();

}

同等の Matlab-Mex に対して gcc 4.4 でコンパイル (gcc44 を使用するように指示されています。これは現在 Matlab でサポートされているバージョンではありませんが、他の理由で必要です):

void mexFunction(int nlhs,mxArray* plhs[], int nrhs, const mxArray* prhs[]){

Well_optimized_code(); //literally the exact same code

}

私は次のようにタイミングを実行しました:

$ time ./C_version

対。

>> tic; mex_version(); toc

タイミングの違いは歴然です。コマンド ラインから実行されるバージョンは、平均で 5.8 秒かかります。Matlab のバージョンは 21 秒で実行されます。コンテキストとして、mex ファイルは、実行に約 26 秒かかる SimBiology ツールボックスのアルゴリズムを置き換えます。

Matlab のアルゴリズムと比較して、C と mex の両方のバージョンは、openMP への呼び出しを使用して最大 27 スレッドまで直線的にスケーリングしますが、プロファイリングの目的で、これらの呼び出しは無効化され、コメント化されています。

mex ファイルとしてコンパイルするために必要なフラグを除いて、2 つのバージョンは同じ方法でコンパイルされています。mex ファイルの左と右の引数へのすべての参照を削除しました。つまり、入力も出力もありません。プロファイリング専用です。

偉大で輝かしい Google は、位置に依存しないコードがスローダウンの原因であってはならないと通知してくれました。

どんな助けでも大歓迎です、

アンドリュー

4

2 に答える 2

14

Mathworks の連絡先に電子メールを送信し、自分のコードをいじって、さまざまな方法で自分のコードをプロファイリングしてから 1 か月後、答えが得られました。ただし、技術的な質問に対して私がこれまでに受けた回答の中で、最も不満足な回答かもしれません。

短いバージョンは、「Matlab バージョン 2011a (公式にリリースされた先週) にアップグレードします。この問題は現在解決されています」です。

より長いバージョンは、バージョン 2010b 以前の mex ゲートウェイに関連するオーバーヘッドの問題を考慮しています。私が抽出できた最良の説明は、このオーバーヘッドは一度評価されるのではなく、関数がリンクされたライブラリにある別の関数を呼び出すたびに少しずつ支払うということです。

なぜこれが起こるのかは私を困惑させますが、少なくとも私が行った SHARK プロファイリングと一致しています。ネイティブ アプリと mex アプリの違いをプロファイリングして比較すると、繰り返されるパターンがあります。私がアプリ用に書いたソースコードに含まれる関数に費やされる時間は変わりません。ネイティブ実装と mex 実装を比較すると、ライブラリ関数で費やされる時間が少し増加します。このライブラリを構築するために使用される別のライブラリの関数は、違いを大幅に増加させます。BLASの実装までに到達するまで、さらに深く進むにつれて時間差は増加し続けます。

頻繁に使用される 2 つの BLAS 関数が主な原因でした。ネイティブ アプリで計算時間の約 1% を要した関数が、mex 関数では 30% でクロックインしていました。

mex ゲートウェイの実装は、2010b と 2011a の間で変更されたようです。私の macbook では、ネイティブ アプリは約 6 秒、mex バージョンは 6.5 秒かかります。これは私が対処できるオーバーヘッドです。

根本的な原因については、私は推測することしかできません。Matlab のルーツはインタープリティブ コーディングにあります。mex 関数は動的ライブラリであるため、各 mex ライブラリは実行時まで何に対してリンクされているかを認識していなかったと思います。Matlab は、ユーザーが mex を使用することはめったになく、計算集約型の小さなチャンクのみを使用することを示唆しているため、大規模なプログラム (ODE ソルバーなど) はめったに実装されないと思います。これらのプログラムは、私のものと同様に、最も被害を受けているプログラムです。

C で実装され、mex を使用してコンパイルされることがわかっているいくつかの Matlab 関数のプロファイルを作成しました (特に、SimBiology ツールボックスの一部である運動モデルで sbioaccelerate を呼び出した後の sbiosimulate)。したがって、2011a の更新は、通常の半年ごとの更新よりも広く有益であるように思われます。

同様の問題を抱えている他のコーダーの幸運を祈ります。私を正しい方向に向かわせてくれたすべての有益なアドバイスに感謝します。

-- アンドリュー

于 2011-04-22T16:02:18.367 に答える
3

Matlab は配列を列優先として格納し、C/C++ は行優先として格納することを思い出してください。ループ構造/アルゴリズムが行優先方式で反復されている可能性はありますか?その結果、Matlab ではメモリ アクセス時間が遅くなり、C/C++ ではアクセス時間が速くなりますか?

于 2011-03-08T16:33:11.007 に答える