(原)mkl的cblas_sgemm和cblas_dgemm


轉載請注明出處:

http://www.cnblogs.com/darkknightzh/p/5553336.html

參考網址:

mkl-11.3.2-developer-reference-c_0.pdf(intel官網下載)

http://goodluck1982.blog.sohu.com/94851969.html

 

void cblas_sgemm(const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE transa, const CBLAS_TRANSPOSE transb, const MKL_INT m, const MKL_INT n, const MKL_INT k, const float alpha, const float *a, const MKL_INT lda, const float *b, const MKL_INT ldb, const float beta, float *c, const MKL_INT ldc);

void cblas_dgemm(const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE transa, const CBLAS_TRANSPOSE transb, const MKL_INT m, const MKL_INT n, const MKL_INT k, const double    alpha, const double *a, const MKL_INT lda, const double *b, const MKL_INT ldb, const double beta, double *c, const MKL_INT ldc);

 參考intel的官方pdf手冊

計算:C := alpha*op(A)*op(B) + beta*C

注意:a、b、c指輸入的緩沖區,A、B、C指真正需要計算的緩沖區(如果需要對一小塊矩陣進行計算,這兩組就不一樣了)。

 

其中,op(X) 表示:

op(X) = X,原始矩陣

op(X) = ${{X}^{T}}$,轉置矩陣

op(X) = ${{X}^{H}}$,共軛矩陣

 

A為m*k的矩陣(m行k列)

B為k*n的矩陣

C為m*n的矩陣

 

參數:

Layout:表示二維矩陣存儲是按行優先(CblasRowMajor)還是列優先(CblasColMajor)。

            C++里面是行優先存儲的;fortran是列優先存儲數據。(為了讓fortran調用方便吧)

transa、transb:可為CblasNoTrans、CblasTrans、CblasConjTrans

m:矩陣a和c的行數

n:矩陣b和c的列數

k:矩陣a的列數,矩陣c的行數

lda:行優先 & 不轉置時,$lda\ge \max (1,k)$

       行優先 & 轉置時,$lda\ge \max (1,m)$

       由於用的是C++,不太可能會使用fortran,列優先就不管了(ldb和ldc也不考慮)

ldb:行優先 & 不轉置時,ldb*k的矩陣,b矩陣左上角包含n*k的B矩陣

       行優先 & 轉置時,ldb*n的矩陣,b矩陣左上角包含k*n的B矩陣

ldc:行優先時,$ldc\ge \max (1,n)$

       由於用的是C++,不太可能會使用fortran,列優先就不管了

 

如上面注意的地方所說,如果不是計算小塊矩陣的話,實際上lda、ldb、ldc和各自的m、n、k相等(注意行優先和列優先)

 

小塊的問題,可見參考網址。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM