CBLAS的安装与使用
生活随笔
收集整理的這篇文章主要介紹了
CBLAS的安装与使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CBLAS的安裝與使用
分類: MathTool 2007-12-09 14:16 7145人閱讀 評論(1) 收藏 舉報 floatfortran語言iostreammakefilec ? CBLAS的安裝與使用 烤魚片(@eii.dlmu) cleverysm@163.com CBLAS是BLAS的C語言接口。BLAS的全稱是Basic Linear Algebra Subprograms,中文大概可以叫做基礎線性代數子程序。主要是用于向量和矩陣計算的高性能數學庫。本身BLAS是用Fortran寫的,為了方便C/C++程序的使用,就有了BLAS的C接口庫CBLAS。BLAS的主頁是http://www.netlib.org/blas/,CBLAS的下載地址也可以在這個頁面上找到。 CBLAS安裝需要先裝BLAS,從主頁上下載blas.tgz,解壓,根據系統修改make.inc和Makefile,make,就會生成一個blas_LINUX.a文件。然后,下載cblas.tgz,解壓,在目錄下將Makefile.*文件改名或者做一個鏈接文件為Makefile.in文件,比如在linux下就是ln -s Makefile.LINUX Makefile.in,根據具體情況修改Makefile.in文件,主要是BLAS的庫文件路徑BLLIB和CBLAS的安裝目錄CBDIR,make help就可以打印出可以使用的make命令,要生成全部文件就是用make all。在$(CBDIR)目錄下的$(CBLIBDIR)將生成CBLAS的庫文件$(CBLIB),cblas_LINUX.a。 在CBLAS的安裝目錄$(CBDIR)下的src目錄中有個cblas.h是包括的CBLAS的函數和常量的頭文件,使用CBLAS的時候就需要這個頭文件,同時還需要BLAS的庫文件$(BLLIB )和CBLAS的庫文件$(CBLIB)。 CBLAS/BLAS分為3個level,level1是用于向量的計算,level2是用于向量和矩陣之間的計算,level3是矩陣之間的計算。比如計算矩陣的乘法就是屬于level3,這里就用矩陣乘法來學習使用CBLAS。 計算矩陣乘法的函數之一是 cblas_sgemm,使用單精度實數,另外還有對應雙精度實數,單精度復數和雙精度復數的函數。在此以 cblas_sgemm為例。 函數定義為: void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const float alpha, const float?*A, const int lda, const float?*B, const int ldb, const float beta, float?*C, const int ldc) 關于此函數的詳細定義可以在http://www.netlib.org/blas/sgemm.f找到,只不過是fortran語言的,這個C語言版的略有差別。 此函數計算的是 C = alpha*op( A )*op( B ) + beta*C, const enum CBLAS_ORDER Order,這是指的數據的存儲形式,在CBLAS的函數中無論一維還是二維數據都是用一維數組存儲,這就要涉及是行主序還是列主序,在C語言中數組是用行主序,fortran中是列主序。我還是習慣于是用行主序,所以這個參數是用CblasRowMajor,如果是列主序的話就是CblasColMajor。 const enum CBLAS_TRANSPOSE TransA和???????????????? const enum CBLAS_TRANSPOSE TransB,這兩個參數影響的是op( A )和op( B),可選參數為CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113,其中TransA = CblasNoTrans,?op( A ) = A,TransA = CblasTrans,?op( A ) = A',TransA = CblasConjTrans,?op( A ) = A'。 TransB類似。 const int M,矩陣A的行,矩陣C的行 const int N,矩陣B的列,矩陣C的列 const int K,矩陣A的列,矩陣B的行 const float alpha, const float beta,計算公式中的兩個參數值,如果只是計算C=A*B,則alpha=1,beta=0 const float?*A, const float?*B, const float?*C,矩陣ABC的數據 const int lda, const int ldb, const int ldc,在BLAS的文檔里,這三個參數分別為ABC的行數,但是實際使用發現,在CBLAS里應該是列數。 我在這里計算兩個簡單矩陣的乘法。 A: 1,2,3 4,5,6 7,8,9 8,7,6 B: 5,4 3,2 1,0 程序代碼: //因為程序是C++,而CBLAS是C語言寫的,所以在此處用extern關鍵字 extern"C" { ??? #include<cblas.h>?? } #include<iostream> using namespace std; int main(void) { ??? ??? const enum CBLAS_ORDER Order=CblasRowMajor; ??? const enum CBLAS_TRANSPOSE TransA=CblasNoTrans; ??? const enum CBLAS_TRANSPOSE TransB=CblasNoTrans; ??? const int M=4;//A的行數,C的行數 ??? const int N=2;//B的列數,C的列數 ??? const int K=3;//A的列數,B的行數 ??? const float alpha=1; ??? const float beta=0; ??? const int lda=K;//A的列 ??? const int ldb=N;//B的列 ??? const int ldc=N;//C的列 ??? const float A[K*M]={1,2,3,4,5,6,7,8,9,8,7,6}; ??? const float B[K*N]={5,4,3,2,1,0}; ??? float C[M*N]; ??? ??? cblas_sgemm(Order, TransA, TransB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); ??? ? ??? for(int i=0;i<M;i++) ??? { ?????? for(int j=0;j<N;j++) ?????? { ?????????? cout<<C[i*N+j]<<"/t"; ?????? } ?????? cout<<endl; ??? } ??? ??? return EXIT_SUCCESS; } 在編譯的時候需要帶上cblas_LINUX.a和blas_LINUX.a,比如, g++ main.cpp cblas_LINUX.a blas_LINUX.a -o main 當然,這里假定是這兩個.a文件是放在可以直接訪問的位置,或者寫全路徑也可以。 這種做法在CentOS.5下順利通過,但是在我的Ubuntu.7.10下出了問題,blas_LINUX.a正常編譯生成,但在鏈接的時候出了錯誤,所以只好從源里安裝了atlas,sudo apt-get install atlas3-base,在/usr/lib/atlas/目錄下就會有libblas.*和liblapack.*庫文件,只需要在鏈接的時候用這里的blas庫文件替換上文安裝的BLAS就可以正常編譯通過。 另外,在GSL下也有BLAS和CBLAS,在boost里有ublas也提供CBLAS/BLAS的功能,有時間也拿來研究研究。總結
以上是生活随笔為你收集整理的CBLAS的安装与使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用OpenCV检测自定义目标
- 下一篇: linux profile of env