7

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 秒を報告

4

3 に答える 3

12

まず、パフォーマンスの比較を行うときは、ターボブースト (TB) を無効にしていることを確認してください。私のシステムでは、macport の gcc 4.5 を使用し、ターボブーストなしで、3.5 秒を取得します。これは 8.4 GFLOPS に相当しますが、私の 2.3 コア i7 の理論上のピークは 9.2GFLOPS であり、それほど悪くはありません。

MatLab は Intel MKL に基づいており、報告されたパフォーマンスを見ると、明らかにマルチスレッド バージョンを使用しています。Eigen のような小さなライブラリが、それ自体の CPU で Intel を打ち負かすことはまずありません!

Numpy は、任意の BLAS ライブラリ、Atlas、MKL、OpenBLAS、eigen-blas などを使用できます。あなたの場合、高速な Atlas を使用していたと思います。

最後に、パフォーマンスを向上させる方法を次に示します。-fopenmp を使用してコンパイルすることにより、Eigen でマルチスレッドを有効にします。デフォルトでは、Eigen はスレッド数として OpenMP で定義されているデフォルトのスレッド数を使用します。残念ながら、この数は物理コアではなく論理コアの数に対応しているため、ハイパースレッディングが無効になっていることを確認するか、OMP_NUM_THREADS 環境変数を物理コア数に定義してください。ここでは、TB なしで 1.25 秒、TB ありで 0.95 秒を取得します。

于 2013-02-10T09:18:16.883 に答える
2

Matlabが高速である理由は、IntelMKLを使用しているためです。Eigenも使用できますが(こちらを参照)、もちろん購入する必要があります。

そうは言っても、Eigenが遅くなる理由はいくつかあります。PythonとMATLABとEigenを比較するには、実際には、それぞれの言語で3つの同等のバージョンの操作をコーディングする必要があります。また、Matlabは結果をキャッシュするため、その魔法があなたをだましていないことを確認するために、新しいMatlabセッションから開始する必要があることに注意してください。

また、MatlabのMexオーバーヘッドは存在しません。そこでのOPは、新しいバージョンが問題を「修正」したと報告していますが、すべてのオーバーヘッドが完全にクリアされた場合は驚きます。

于 2013-02-10T10:07:16.743 に答える