gpt4 book ai didi

c++ - Blas 看起来很慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:50 28 4
gpt4 key购买 nike

我在我的机器上比较矩阵乘法,似乎 c++ blas 非常慢。一个1000x1000的矩阵相乘大约需要4秒,而在python中同样需要1.5秒左右。我认为链接可能有问题,但我真的不知道如何解决这些问题。这是c++代码

    #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代码是

    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

感谢您的帮助!

最佳答案

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

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

Intel 的 MKL 是一种 BLAS,它通常非常快(至少如果您没有 AMD cpu 的话),但众所周知难以链接。他们甚至有一个网络应用程序可以帮助您编写链接行:http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor .我在 OpenBLAS ( http://www.openblas.net/ ) 方面运气不错,在 i7-3770K CPU 上获得的性能在 MKL 的 1% 或 2% 以内。 OpenBLAS 也很容易编译;它比 ATLAS 更不令人头疼。

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

g++ -o program mm.cpp -I/home/gsl/include -lm -L/home/gsl/lib -lgsl -lcblas -lopenblas 

关于c++ - Blas 看起来很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20213381/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com