CBLAS編譯安裝與使用舉例

2021-06-28 14:27:29 字數 3165 閱讀 1952

在github上看到有人用blas library優化自己的原始碼,對此產生了強烈興趣。

準備自己動手實踐一下,網上搜尋了一大堆編譯安裝blas教程的資料,沒乙個靠譜的,編譯過程中遇到一堆的問題。因為自己沒有root許可權,所以只能在home目錄中本地編譯使用cblas,然後本地鏈結編譯得到的庫檔案到應用程式。

最後自己憑著直覺連蒙帶猜,終於把blas與cblas裝上,並投入到例項中優化執行應用程式。填補了很多linux知識。

首先要解釋一下blas,cblas與lapaxk之間的區別與聯絡。

cblas只是blas的c語言版本,所以cblas安裝需要先裝blas

1. 編譯blas,進入blas目錄執行下面的命令

gfortran -c  -o3    *.f                 # 編譯所有的 .f 檔案,生成 .o檔案  

ar rv libblas.a *.o # 鏈結所有的 .o檔案,生成 .a 檔案

2. 編譯cblas,進入cblas目錄,首先根據自己的作業系統平台,將某個makefiel.***複製為makefile.in,***表示作業系統。如果是linux,那麼就將makefile.linux 複製為 makefile.in。

cp ../blas/libblas.a  testing  # 將上一步編譯成功的 libblas.a 複製到 cblas目錄下的testing子目錄  

make # 編譯所有的目錄

此時會在cblas安裝目錄下的lib目錄中產生乙個靜態鏈結庫檔案

cblas_linux.a,這個庫檔案和上面得到的libblas.a檔案就是我們所需要的。另外還需要的就是cblas/include中的cblas.h標頭檔案。將三個檔案全部拷貝到,你需呼叫的應用程式原始碼目錄中。

到此blas和cblas的安裝任務完成,可以看出,這裡安裝的實際含義是編譯得到兩個庫檔案和乙個標頭檔案,再將這三個檔案放置到gcc的搜尋路徑中去(例如可以在拷貝到/esr/local/lib,或在/usr/local/lib下做乙個快捷鏈結,也可直接像我上面那樣複製的)。

cd /usr/local/lib

ln -s ./cblas/lib/cblas_linux.a ./libcblas.a

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 )

此函式計算的是 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的資料

計算兩個簡單矩陣的乘法。

a:1,2,3

4,5,6

7,8,9

8,7,6

b:5,4

3,21,0

//因為程式是c++,而cblas是c語言寫的,所以在此處用extern關鍵字extern"c"

#includeusing namespace std;

int main(void) ;

const float b[k*n]=;

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

比如:g++ main.cpp cblas_linux.a libblas.a -o main

如果是寫成makefile檔案,則修改變數objs = main.o cblas_linux.a libblas.a

當然,這裡假定是這兩個.a檔案是放在可以直接訪問的位置,或者寫全路徑也可以。

這個有時間再補充,現在這個時間比較尷尬。不過確實對應用起到了優化作用,執行時間從160多s降到了115s,只是簡單將序列**用函式clabs_caxpy替代。

CBLAS的安裝與使用

cblas的安裝與使用 ysmcleverysm gmail.com 在cblas的安裝目錄 cbdir 下的src目錄中有個cblas.h是包括的cblas的函式和常量的標頭檔案,使用cblas的時候就需要這個標頭檔案,同時還需要blas的庫檔案 bllib 和cblas的庫檔案 cblib cb...

cblas安裝以及使用例項

c bdir 目錄下 的 cblibdir 將生成cblas的庫檔案 cblib cblas linux.a。在cblas的安裝目錄 c bdir 下的s rc目錄 中有個c blas h是包 括的cb las的 函式和常 量的頭文 件,使用 cbla s的時候 就需要這 個頭檔案 同時還 需要bl...

Regex 的安裝 編譯與使用

隔段時間沒沾vc,再回過頭來用regex 時,竟然不知道怎麼安裝了,雖然以前安裝使用的次數多了,但還是沒記住,看來還是好記性不如爛筆頭啊,再總結一次吧。環境 xp vc6.0 sp6 ms sdk 且記環境變數中include的值中ms sdk的位置要先於vc6.0的位置。如 c microsoft...