首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Blas似乎非常慢

Blas似乎非常慢
EN

Stack Overflow用户
提问于 2013-11-26 17:43:23
回答 1查看 1.6K关注 0票数 5

我在我的机器上比较矩阵乘法,看起来c++ blas非常慢。乘一个1000x1000矩阵大约需要4秒,而在python中需要的时间大约是1.5秒。我认为链接可能有问题,但我真的不太知道如何修复这类事情。下面是c++代码

代码语言:javascript
复制
    #include <stdio.h>
#include <iostream>
#include <time.h>
#include <gsl/gsl_blas.h>
#include <gsl/gsl_sf_bessel.h>
using namespace std;


double diffclock(clock_t clock1,clock_t clock2) { double diffticks=clock1-clock2; double diffms=(diffticks*1000)/CLOCKS_PER_SEC; return diffms; }




int
main (void)
{
  double* a=new double[1000*1000];

  double* b=new double[1000*1000];

  double* c=new double[1000*1000];

  for (int i=0;i<1000*1000;i++){
  a[i]=i;
  b[i]=i/5+i*i/100;}

  gsl_matrix_view A = gsl_matrix_view_array(a, 1000, 1000);
  gsl_matrix_view B = gsl_matrix_view_array(b, 1000, 1000);
  gsl_matrix_view C = gsl_matrix_view_array(c, 1000, 1000);

  /* Compute C = A B */
  cout<<"start"<<endl;
  clock_t begin=clock();

  gsl_blas_dgemm (CblasNoTrans, CblasNoTrans,
                  1.0, &A.matrix, &B.matrix,
                  0.0, &C.matrix);
  clock_t end=clock();
  cout<<double(diffclock(end,begin))<<endl;

  return 0;  
}

我正在使用//g++ -o程序mm.cpp -I/home/gsl/include -lm -L/home/gsl/lib -lgsl -lgslcblas进行编译

python代码是

代码语言:javascript
复制
    import time
import numpy as np



n=1000
a=np.zeros((n,n))
b=np.zeros((n,n))
for i in range(0,n):
    for j in range(0,n):
        a[i,j]=i*n+j
        b[i,j]=(i*n+j)/5+(n*i+j)**2/5
print "start"
start=time.time()
c=np.dot(a,b)
end=time.time()
print end-start

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2013-11-27 20:35:51

BLAS中的子例程是事实上的标准,并且存在大量优化的和特定于供应商的库来实现该接口。numpy和gsl都可以链接到各种不同的BLASes (或者在某些情况下使用它们自己的实现),但是从这个角度来看,numpy和gsl基本上都是包装器--您得到的性能基本上只依赖于它们所链接的BLAS。

使用GSL,可以相对容易地链接到替代的BLAS。这里有一些说明:http://www.gnu.org/software/gsl/manual/html_node/Linking-with-an-alternative-BLAS-library.html

英特尔的MKL是一个BLAS,通常速度相当快(至少如果你没有AMD cpu),但出了名的难以连接。他们甚至有一个web应用程序来帮助你编写链接行:http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor。我在OpenBLAS (http://www.openblas.net/)上有相当好的运气,在i7-3770KCPU上的性能是MKL的1%或2%。OpenBLAS也很容易编译;它不像ATLAS那么麻烦。

一旦您获得了OpenBLAS,无论是通过从源代码编译还是从包管理器下载(如果您使用*nix ),修改后的编译行基本上是

代码语言:javascript
复制
g++ -o program mm.cpp -I/home/gsl/include -lm -L/home/gsl/lib -lgsl -lcblas -lopenblas 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20213381

复制
相关文章

相似问题

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