次のコードを使用して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)
Eigenとg ++のどのバージョンをお使いですか? –
numpyの配列では、 '*'は* element-wise *の乗算です。 'c = a * b'を' c = a.dot(b) 'に変更してください。あるいは、あなたが十分に新しいバージョンのPython 3とnumpyを使っているなら、 'c = a @ b'と書くことができます。 –
Avi Ginsburg、Eigenバージョン3.2、g ++バージョン4.9.2、問題はEigen 3.2を使用していた –