web-dev-qa-db-ja.com

OctaveがMATLABより遅いのはなぜですか?

私はいくつかのプロジェクトでOctaveとMATLABを使用してきましたが、いくつかの質問に遭遇しました。この質問 なぜ/ OctaveよりもMATLABを好むのか? )いくつか答えましたが、まだ1つ残っています...

OctaveとMATLABのパフォーマンスを比較するいくつかの投稿/他のソースを読み、標準操作でOctaveが一般にMATLABよりもはるかに遅いという一般的なコンセンサスを確認する標準スクリプトで独自のテストを実行しました(反復、もちろん、比較が有意義になるように)。

コンセンサスは、MATLABのパフォーマンスの向上のほとんどが、実行時に大きなループをコンパイルするJITコンパイラに起因することを示唆しているようです。これは理にかなっており、これらの場合に最大のパフォーマンスの違いが発生するようです(例 Mathworks Matlab vs Gnu Octave

私の質問は次のとおりです。Octaveでベクトル化されたコードの実行速度が遅くなるのはなぜですか?この場合、ループの前にメモリを確保し、ネイティブC/C++ループが操作を実行する必要があるようです。これにより、ベクトル化コードのOctaveとMATLABのパフォーマンスが同等になります。さらに、これはより広い意味合いを持っていますか?つまり、JITコンパイラーが不要/未使用であるようにコードが記述されている場合でも、Octaveは複雑な操作に対してパフォーマンスが低下する可能性がありますか?

37
Sam Grondahl

Matlabコードを高速化する方法は4つあります。

  • JIT:実行時のコンパイルはループに役立ちますが、私の事例によると、コードの他の部分も高速化(または少なくとも相互作用)しているようです。

  • C/C++での関数の実装:Matlab/Octaveに実装されている多くのMatlab/Octave関数があります。すべてのリリースで、組み込みにされるそれらの多くがあります。

  • マルチスレッド: 関数のリスト には、マルチスレッド実装があり、関数呼び出しを高速化します。

  • 一般に、より効率的な実装。たとえば、メディアンフィルターは、数リリース前に整数入力の速度を大幅に向上させました。

これらのアプローチにはすべて、コードの高速化に専念する開発者が必要です。私の知る限り、Octave開発者の主な関心事は、(Matlab)機能が完全に存在することを確認することですが、パフォーマンスの向上は過去数年間のMatlab開発の焦点であったようです。

35
Jonas

Matlabは、ベクトル演算および行列演算に内部でIntel Math Kernel Library(Intel MKL)を使用します。これにより、MatlabはOctaveに比べて大きな利点があります。

Matlabでコマンド 'version -lapack'および 'version -blas'を試して、Matlabが使用しているMKLのバージョンを確認します。

MatlabによるMKLの使用法を説明するクイックリンクは http://stanford.edu/~echu508/matlab.html です。

インテルMKLは独自仕様です。 software.intel.com/en-us/intel-mklただし、非商用使用の場合、Linuxバージョンは無料です。 Octaveが何らかの方法でマシンにインストールされたMKLを使用できる場合、Octaveを大幅に高速化するはずです。

17
Sooraj