簡體   English   中英

布拉斯似乎很慢

[英]Blas seems very slow

我在我的機器上比較矩陣乘法,似乎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 program 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中的子程序是事實上的標准,並且存在實現該接口的大量優化和供應商特定的庫。 numpy和gsl都可以鏈接到各種不同的BLAS(或者在某些情況下使用它們自己的實現),但是從這個角度看,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-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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM