首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本征矩阵乘法比cblas慢?

本征矩阵乘法比cblas慢?
EN

Stack Overflow用户
提问于 2016-12-01 06:48:48
回答 1查看 641关注 0票数 1

我使用下面的代码来测试本征性能。

代码语言:javascript
复制
#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;
}

我使用以下命令编译它:

代码语言:javascript
复制
g++ test.cpp  -O3 -fopenmp -lblas -std=c++11 -o test

研究结果如下:

特征: 1422毫秒

cblas: 432毫秒

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

另一个问题是使用numpy我可以得到24 ms

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-01 08:13:31

说您正在使用cblas,提供的信息非常少,因为cblas只是一个API。底层的BLAS库可以是netlib的BLAS,OpenBLAS,ATLAS,Intel,苹果的加速,甚至是EigenBlas。考虑到您的度量,很明显您的底层BLAS是一个高度优化的BLAS,它利用了AVX+FMA+多线程。因此,为了进行公平的比较,您还必须通过使用-march=native -fopenmp进行编译,并确保您使用的是特征3.3,从而在特征端启用这些特性。那么表演应该是差不多的。

关于numpy,Warren Weckesser已经解决了这个问题。您可能会发现,在标准计算机上执行2*3000^3=54e9浮点操作的24 is是不可能的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40904246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档