轉載請注明出處:
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相等(注意行優先和列優先)
小塊的問題,可見參考網址。