Я использую следующий код для проверки собственной производительности.Умножение матрицы на матрицу медленнее, чем 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 мс
я делаю что-то неправильно? Согласно их эталону, он должен быть быстрее.
Другая проблема заключается в том, что с помощью NumPy я получаю 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, '*' is * element-wise * умножение. Измените 'c = a * b' на' c = a.dot (b) '. Или, если вы используете достаточно новую версию Python 3 и numpy, вы можете написать 'c = a @ b'. –
Avi Ginsburg, Eigen version 3.2, g ++ version 4.9.2, проблема заключалась в использовании Eigen 3.2 –