特征矩阵乘法比CBLA慢

Eigen matrix multiplication slower than cblas?

本文关键字:CBLA 特征      更新时间:2023-10-16

我使用以下代码测试特征。

#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 ms

cblas:432 ms

我做错了什么吗?根据他们的基准,它应该更快。

另一个问题是使用numpy i获得24 ms

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)

说您使用的是cblas提供的信息很少,因为cblas只是API。基础库库可以是Netlib的Blas,OpenBlas,Atlas,Intel MKL,Apple的加速甚至特征Blas ...鉴于您的测量值,很明显,您的基础Blas是高度优化的一个利用AVX FMA 多线程 多线程。因此,为了进行公平的比较,您还必须通过使用-march=native -fopenmp编译并确保使用EIGEN 3.3来启用Eigen方面的这些功能。那么性能应该大致相同。

关于Numpy,Warren Weckesser已经解决了问题。您可能已经确定自己在标准计算机上执行2*3000^3=54e9浮点操作的24ms是不可能的。