首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >特征+ MKL或OpenBLAS慢于Numpy/Scipy + OpenBLAS

特征+ MKL或OpenBLAS慢于Numpy/Scipy + OpenBLAS
EN

Stack Overflow用户
提问于 2017-09-13 20:47:18
回答 2查看 1.6K关注 0票数 3

我从c++自动取款机开始,并希望与矩阵一起工作,并在一般情况下加快速度。以前曾与Python+Numpy+OpenBLAS合作过。认为c++ +特征+ MKL可能更快,或者至少不是更慢。

我的c++代码:

代码语言:javascript
复制
#define EIGEN_USE_MKL_ALL
#include <iostream>
#include <Eigen/Dense>
#include <Eigen/LU>
#include <chrono>

using namespace std;
using namespace Eigen;

int main()
{
    int n = Eigen::nbThreads( );
    cout << "#Threads: " << n << endl;

    uint16_t size = 4000;
    MatrixXd a = MatrixXd::Random(size,size);

    clock_t start = clock ();
    PartialPivLU<MatrixXd> lu = PartialPivLU<MatrixXd>(a);

    float timeElapsed = double( clock() - start ) / CLOCKS_PER_SEC; 
    cout << "Elasped time is " << timeElapsed << " seconds." << endl ;
}

我的Python代码:

代码语言:javascript
复制
import numpy as np
from time import time
from scipy import linalg as la

size = 4000

A = np.random.random((size, size))

t = time()
LU, piv = la.lu_factor(A)
print(time()-t)

我的时间表:

代码语言:javascript
复制
C++     2.4s
Python  1.2s

为什么c++比Python慢?

我正在使用以下方法编译c++:

代码语言:javascript
复制
g++ main.cpp -o main -lopenblas -O3 -fopenmp  -DMKL_LP64 -I/usr/local/include/mkl/include

MKL确实在工作:如果我禁用它,运行时间大约是13s。

我还尝试了C++ + OpenBLAS,它也为我提供了大约2.4秒。

你知道为什么C++和本征比矮胖的要慢吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-13 21:11:56

时机不对。这是wall clock time vs. CPU time的典型症状。当我使用来自system_clock头的<chrono>时,它“神奇地”变得更快。

代码语言:javascript
复制
#define EIGEN_USE_MKL_ALL
#include <iostream>
#include <Eigen/Dense>
#include <Eigen/LU>
#include <chrono>

int main()
{
    int const n = Eigen::nbThreads( );
    std::cout << "#Threads: " << n << std::endl;

    int const size = 4000;
    Eigen::MatrixXd a = Eigen::MatrixXd::Random(size,size);

    auto start = std::chrono::system_clock::now();

    Eigen::PartialPivLU<Eigen::MatrixXd> lu(a);

    auto stop = std::chrono::system_clock::now();

    std::cout << "Elasped time is "
              << std::chrono::duration<double>{stop - start}.count()
              << " seconds." << std::endl;
}

我用

代码语言:javascript
复制
icc -O3 -mkl -std=c++11 -DNDEBUG -I/usr/include/eigen3/ test.cpp

得到输出

代码语言:javascript
复制
#Threads: 1
Elasped time is 0.295782 seconds.

您的Python版本在我的机器上报告0.399146080017

或者,为了获得类似的计时,您可以在Python中使用time.clock() (CPU时间)而不是time.time() (挂钟时间)。

票数 4
EN

Stack Overflow用户

发布于 2017-09-13 20:59:09

这是不公平的比较。python例程以浮动精度操作,而c++代码则需要处理双倍。这正好是计算时间的两倍。

代码语言:javascript
复制
>>> type(np.random.random_sample())
<type 'float'>

您应该与MatrixXf而不是MatrixXd进行比较,您的MKL代码应该是同样快的。

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

https://stackoverflow.com/questions/46206580

复制
相关文章

相似问题

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