ベンチマークは、誤解されるように設計されています。
行列 * 行列積を見てみましょう。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 と同等またはそれを打ち負かすことができると言ってベンチマークを提供する場合は、注意して独自のベンチマークを実行してください。通常、異なる結果が得られます;-)。