(原)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相等(注意行优先和列优先)
小块的问题,可见参考网址。
posted on 2016-06-02 15:52 darkknightzh 阅读(8142) 评论(0) 编辑 收藏 举报