Eigen ライブラリを使用して、2 つの大きな行列の単純な乗算を研究しています。この乗算は、同じサイズの行列の場合、Matlab と Python の両方よりも著しく遅いようです。
Eigen 操作を高速化するために何かすることはありますか?
問題の詳細
X : ランダムな 1000 x 50000 行列
Y : ランダムな 50000 x 300 行列
タイミングの実験 (2011 年後半の Macbook Pro で)
Matlab の使用: X*Y には約 1.3 秒かかります
Enthought Python を使用: numpy.dot( X, Y) には ~ 2.2 秒かかります
Eigen の使用: X*Y には約 2.7 秒かかります
固有値の詳細
私の固有コードを (MEX 関数として) 取得できます: https://gist.github.com/michaelchughes/4742878
この MEX 関数は、Matlab から 2 つの行列を読み取り、それらの積を返します。
この MEX 関数を行列積演算なしで (つまり、IO を実行するだけで) 実行すると、無視できるオーバーヘッドが発生するため、関数と Matlab の間の IO はパフォーマンスの大きな違いを説明しません。それは明らかに実際の行列積演算です。
これらの最適化フラグを使用して、g ++でコンパイルしています:「-O3 -DNDEBUG」
最新の安定した Eigen ヘッダー ファイル (3.1.2) を使用しています。
Eigen のパフォーマンスを改善する方法について何か提案はありますか? 私が見ているギャップを再現できる人はいますか?
更新 コンパイラは本当に重要なようです。元の Eigen のタイミングは、Apple XCode の g++ のバージョンである llvm-g++-4.2 を使用して行われました。
MacPorts (同じ CXXOPTIMFLAGS) 経由でダウンロードした g++-4.7 を使用すると、2.7 秒ではなく 2.4 秒になります。
より良いコンパイル方法に関する他の提案は大歓迎です。
この実験の生の C++ コードも入手できます: https://gist.github.com/michaelchughes/4747789
./MatProdEigen 1000 50000 300
g++-4.7 で 2.4 秒を報告