特征矩阵乘法比CBLA慢
Eigen matrix multiplication slower than 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 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是不可能的。
相关文章:
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 特征命名访问向量段
- 将特征矩阵的向量设置为0
- 特征:模板函数中矩阵的平面图
- basic_string的前导/尾部不区分空格的特征
- 特征 3 类的模板专用化
- 特征 c++:复矩阵的面积双曲正切(atanh)
- C++ 中的特征向量计算
- 根据C++标准的定义实现"is_similar"类型特征
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 有没有办法找到特征矩阵系数的中值?
- 如何将高维数据映射到特征类型?
- 将平面阵列重塑为复杂的特征类型
- 特征 LLT 模块给出不正确的结果?
- 特征模板化函数和维度
- 特征稀疏向量:求最大系数
- 特征 3.3.x:如何在所有行中操作 lamba?
- 特征矩阵乘法比CBLA慢