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 は、位置に依存しないコードがスローダウンの原因であってはならないと通知してくれました。
どんな助けでも大歓迎です、
アンドリュー