2016-12-01 12 views
1

次のコードを使用してEigenのパフォーマンスをテストします。固有ベクトルの乗算はcblasよりも遅いですか?

#include <iostream> 
#include <chrono> 
#define EIGEN_NO_DEBUG 
#include <eigen3/Eigen/Dense> 
#include <cblas.h> 
using namespace std; 
using namespace std::chrono; 

int main() 
{ 
    int n = 3000; 

    high_resolution_clock::time_point t1, t2; 

    Eigen::MatrixXd A(n, n), B(n, n), C(n, n); 

    t1 = high_resolution_clock::now(); 
    C = A * B; 
    t2 = high_resolution_clock::now(); 
    auto dur = duration_cast<milliseconds>(t2 - t1); 
    cout << "eigen: " << dur.count() << endl; 

    t1 = high_resolution_clock::now(); 
    cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, 
       n, n, n, 1.0, A.data(), n, B.data(), n, 1.0, C.data(), n); 
    t2 = high_resolution_clock::now(); 
    dur = duration_cast<milliseconds>(t2 - t1); 
    cout << "cblas: " << dur.count() << endl; 

    return 0; 
} 

私は、次のコマンドでコンパイル:

g++ test.cpp -O3 -fopenmp -lblas -std=c++11 -o test 

結果は以下のとおりです。

固有:1422ミリ秒

CBLAS:432ミリ

私が何かをしています違う?彼らのベンチマークによれば、それはより速くなるはずです。

もう一つの問題は、私はあなたがcblasだけのAPIであるため、cblasはほとんど情報を提供し使用していることを言って24ミリ秒

import time 
import numpy as np 

a = np.random.random((3000, 3000)) 
b = np.random.random((3000, 3000)) 
start = time.time() 
c = a * b 
print("time: ", time.time() - start) 
+0

Eigenとg ++のどのバージョンをお使いですか? –

+2

numpyの配列では、 '*'は* element-wise *の乗算です。 'c = a * b'を' c = a.dot(b) 'に変更してください。あるいは、あなたが十分に新しいバージョンのPython 3とnumpyを使っているなら、 'c = a @ b'と書くことができます。 –

+0

Avi Ginsburg、Eigenバージョン3.2、g ++バージョン4.9.2、問題はEigen 3.2を使用していた –

答えて

1

を取得numpyの使用していることです。基礎となるBLASライブラリは、NetlibのBLAS、OpenBLAS、ATLAS、Intel MKL、AppleのAccelerate、さらにはEigenBlasでも構いません...あなたの測定値を考慮すると、基盤となるBLASは高度に最適化されたAVX + FMA +マルチスレッド。したがって、公平な比較のためには、-march=native -fopenmpをコンパイルしてEigen側でこれらの機能を有効にして、Eigen 3.3を使用していることを確認する必要があります。その後、パフォーマンスはほぼ同じになるはずです。

numpyに関して、Warren Weckesserは既に問題を解決しました。 2*3000^3=54e9浮動小数点演算を標準的なコンピュータで実行するために24msが不可能であることがわかっているかもしれません。

+0

ありがとう、問題はEigen 3.2を使用していた。私はEigen 3.3に切り替わりました。今は350に対して500です。私はblasライブラリを使っていたのですが、libblas3とlibblas-devをインストールしました。 libblas3 - 基本線形代数リファレンス実装、共有ライブラリ、libblas-dev - 基本線形代数サブルーチン3、静的ライブラリ –

+0

Eigen 3.2を-march = nativeでコンパイルしても何も変更されませんでしたがif私はEigen 3.3を使用してそのオプションなしでコンパイルすると、はるかに遅く実行されます –

関連する問題