50

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

私は思わず、eigen がすべての専用ベンダー ライブラリよりも一貫して優れているように見えることに気付きました。質問は次のとおりです。それはどのように可能ですか?mkl/goto はプロセッサ固有の調整されたコードを使用すると想定されますが、固有値はかなり一般的です。

このhttp://download.tuxfamily.org/eigen/btl-results-110323/aat.pdf、本質的には dgemm に注意してください。N=1000 の場合、固有値は約 17Gf、MKL はわずか 12Gf になります。

4

6 に答える 6

38

Eigen には遅延評価があります。からEigen は BLAS/LAPACK とどのように比較されますか? :

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

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

于 2012-04-28T18:06:44.260 に答える
34

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

行列 * 行列積を見てみましょう。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 = alpha x1 + beta x2 など)。それらが有用な場合 (A、B、C マトリックスを使用した 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 と同等またはそれを打ち負かすことができると言ってベンチマークを提供する場合は、注意して独自のベンチマークを実行してください。通常、異なる結果が得られます;-)。

于 2015-12-31T13:52:42.857 に答える
13

ATLAS と Eigen の比較について

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

たとえば、ATLAS がマトリックス - マトリックス積で Eigen よりも 46% 優れていることを示しています。

ベンチマークの結果とベンチマークの実行方法の詳細は、次の場所にあります。

編集:

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

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

こちらもご覧ください

于 2012-09-27T21:29:39.483 に答える
4

Compile Time Function Evaluation (CTFE) により、最適なレジスタ ブロック戦略 (CPU レジスタに格納された小さな一時的なサブマトリックス) を選択できるため、ジェネリック コードは高速になります。

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

于 2016-09-27T06:51:42.410 に答える
2

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

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

于 2012-04-28T18:02:22.250 に答える
2

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

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

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

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

于 2012-06-10T14:02:07.577 に答える