web-dev-qa-db-ja.com

C ++ Eigenライブラリは、特化したベンダーライブラリよりも優れたパフォーマンスを発揮しますか?

私はパフォーマンスのベンチマークを見ていました: http://eigen.tuxfamily.org/index.php?title=Benchmark

私は仕方がありませんでしたが、eigenはすべての専門ベンダーライブラリよりも常に優れているようです。質問は次のとおりです。 mkl/gotoはプロセッサ固有の調整されたコードを使用すると仮定しますが、eigenはかなり一般的です。

これに注意してください http://download.tuxfamily.org/eigen/btl-results-110323/aat.pdf 、本質的にdgemm。 N = 1000の場合、Eigenは約17Gfを取得し、MKLは12Gfのみを取得します

37
Anycorn

Eigenの評価は遅延しています。 EigenはBLAS/LAPACKとどのように比較されますか?

複雑な式が関係する操作の場合、Eigenは操作全体をグローバルに処理および最適化できるため、BLAS実装よりも本質的に高速ですが、BLASはプログラマーに複雑な操作をBLAS固定関数APIに一致する小さなステップに分割させ、非効率を招きます一時的なものの導入による。たとえば、Y = aX + bY操作のベンチマーク結果を参照してください。Eigenは自動的に単一のベクトル化ループを生成しますが、BLAS level1ルーチンへの2つの呼び出しが含まれます。 。

ベンチマーク の2番目のグラフはY = a*X + b*Y、これはEigenが特別に処理するように設計されたものです。ライブラリが作成されたベンチマークで勝つことは不思議ではありません。マトリックスとマトリックスの乗算のようなより一般的なベンチマークは、Eigenに利点を示さないことに気付くでしょう。

28
chrisaycock

ベンチマークは誤解されるように設計されています

マトリックス*マトリックス積を見てみましょう。これで利用可能なベンチマーク page Eigen Webサイトから、Eigen(独自のBLASを使用)が大きな行列(n = 1000)のMKLと同様のタイミングを提供することがわかります。私のコンピューター(コアi7を搭載したラップトップ)でEigen 3.2.6とMKL 11.3を比較しましたが、MKLは1つのスレッドを使用するマトリックスではEigenの3倍、4スレッドを使用するEigenの10倍です。これは完全に異なる結論のように見えます。これには2つの理由があります。 Eigen 3.2.6(内部BLAS)はAVXを使用しません。さらに、マルチスレッドをうまく使用していないようです。このベンチマークは、マルチスレッドなしでAVXサポートを持たないCPUを使用するため、これを隠しています。

通常、これらのC++ライブラリ(Eigen、Armadillo、Blaze)は2つのことをもたらします。

  • 素敵な演算子のオーバーロード:ベクトルと行列で+、*を使用できます。ニースのパフォーマンスを得るには、「スマートテンプレート式」と呼ばれるトリッキーなテクニックを使用して、タイミングを減らすときの一時的な回避(y =アルファx1 +ベータx2とy、x1、x2ベクトルなど)を避け、導入する必要があります有用な場合(A、B、Cマトリックスを使用したA = B * Cなど)。たとえば、A、B、Cが行列である場合、それらはサイズに応じて(A * B)* CまたはA *(B * C)として計算できる場合、より少ない計算のために操作を並べ替えることもできます。
  • 内部BLAS:2つの行列の積を計算するために、内部BLASまたは外部で提供されたもの(MKL、OpenBLAS、ATLAS)に依存できます。大きなマトリックスを搭載したIntelチップでは、MKLはほとんど打ち負かすことができません。小さい行列の場合、MKLはそのような問題のために設計されていないため、MKLを上回ることができます。

通常、これらのライブラリがMKLに対するベンチマークを提供する場合、通常は古いハードウェアを使用し、MKLと同等になるようにマルチスレッドを有効にしません。また、y = alpha x1 + beta x2などのBLASレベル1操作を、とにかく愚かなことであるBLASレベル1関数への2回の呼び出しと比較する場合もあります。

一言で言えば、これらのライブラリはパフォーマンスを損なうことなく行うのが非常に困難な+と*のオーバーロードに非常に便利です。彼らは通常これで良い仕事をします。しかし、彼らがあなたに彼らが自分のBLASで同等であるかMKLに勝つことができるというベンチマークを与えるとき、注意してあなた自身のベンチマークをしてください。通常、異なる結果が得られます;-)。

27
InsideLoop

ATLASとEigenの比較について

ここから始まるEigenメーリングリストでこのスレッドをご覧ください。

例えば、ATLASが行列行列積でEigenよりも46%優れていることを示しています。

ベンチマークの結果の詳細と、ベンチマークの実行方法の詳細については、次をご覧ください。

編集:

私の講義「ハイパフォーマンスコンピューティングのソフトウェアの基礎」では、ulmBLASと呼ばれる小さなフレームワークを作成しました。 ATLASベンチマークスイートが含まれており、学生は [〜#〜] blis [〜#〜] 論文に基づいて独自のマトリックスマトリックス製品を実装できます。 Eigenを測定する最終的なベンチマークを見ることができます。

lmBLAS フレームワークを使用して、独自のベンチマークを作成できます。

また見てください

11
Michael Lehn

コンパイル時間関数評価(CTFE)により、最適なレジスタブロッキング戦略(CPUレジスタに格納された小さな一時的なサブマトリックス)を選択できるため、汎用コードは高速になります。

Mir GLASおよびIntel MKLは、EigenおよびOpenBLASよりも高速です。 Mir GLASはEigenと比較してより一般的です。 ベンチマーク および redditスレッド も参照してください。

2
Ilya Yaroshenko

リンクしたページのさらに下のグラフで見ることができるように、他のライブラリよりも常に優れているとは思えません。そのため、さまざまなライブラリがさまざまなユースケースに合わせて最適化され、さまざまな問題に対してさまざまなライブラリが高速化されます。

通常、allユースケースに対して完全に最適化することはできないため、これは驚くことではありません。特定の操作に対して最適化すると、通常、他のユースケースの最適化オプションが制限されます。

2
sth

少し前に同じ質問をATLASメーリングリストに送信しました。

http://sourceforge.net/mailarchive/message.php?msg_id=28711667

Clint(ATLAS開発者)はこれらのベンチマークを信頼していません。彼は、信頼できるベンチマーク手順を提案しました。暇があればすぐに、この種のベンチマークを行います。

EigenのBLAS機能が実際にGotoBLAS/GotoBLAS、ATLAS、MKLの機能よりも速い場合は、とにかく標準のBLASインターフェイスを提供する必要があります。これにより、このようなEigen-BLASに対するLAPACKのリンクが可能になります。この場合、Matlabや友人にとっても興味深い選択肢になります。

2
Michael Lehn