如何查网站备案号,兰州网站建设实验总结,专业做网站的公司有没有服务器,企业网站服务器建设前言
前面介绍了BLAS Level 1中向量-向量操作#xff0c;以及BLAS Level 2中矩阵-向量的操作#xff0c;就剩下这一篇的BLAS Level 3中的矩阵-矩阵的操作了。对稀疏矩阵的操作以后等要用再看看。对基本的矩阵和向量运算的函数有所了解以后#xff0c;就进行常用参数分析以及BLAS Level 2中矩阵-向量的操作就剩下这一篇的BLAS Level 3中的矩阵-矩阵的操作了。对稀疏矩阵的操作以后等要用再看看。对基本的矩阵和向量运算的函数有所了解以后就进行常用参数分析以及实现了。
所有函数概览
函数名称缺失部分描述cblas_?gemms,d,c,z一般矩阵的矩阵-矩阵乘法cblas_?hemmc,z某个输入矩阵是Hermitian然后计算矩阵-矩阵乘法cblas_?herkc,zHermitian的k阶更新cblas_?herk2c,zHermitian的2k阶更新cblas_?symms,d,c,z某个输入矩阵是对称的然后计算矩阵-矩阵乘法cblas_?syrks,d,c,z对称矩阵的k阶更新cblas_?syr2ks,d,c,z对称矩阵的2k阶更新cblas_?trmms,d,c,z某个输入矩阵是三角的就是你矩阵-矩阵的乘法cblas_?trsms,d,c,z解三角矩阵方程
矩阵运算
cblas_?gemm
作用 : 一般矩阵的矩阵-矩阵乘法定义函数 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);void cblas_cgemm (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 void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zgemm (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 void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);运算 C:α∗op(A)∗op(B)β∗CC:=\alpha*op(A)*op(B)+\beta*C 其中op(x)op(x)可以是op(x)xop(x)=x或者op(x)xTop(x)=x^T或者op(x)XHop(x)=X^H α\alpha和β\beta是标量 A,B,CA,B,C是矩阵: op(A)op(A)是一个m∗km*k的矩阵op(B)op(B)是k∗nk*n的矩阵C是一个m∗nm*n的矩阵输入参数 Layout: 指定矩阵是行优先(CblasRowMajor)还是列优先(CblasColMajor) transa: 指定对矩阵的操作op(A)op(A)如果transaCblasNoTrans那么op(A)Aop(A)=A如果transaCblasTrans那么op(A)ATop(A)=A^T如果transaCblasConjTrans那么op(A)AHop(A)=A^H transb: 同上 m: 矩阵op(A)op(A)和CC的行数n: 矩阵op(B)op(B)和C的列数 k: 矩阵op(A)op(A)和op(B)op(B)的列数 alpha: 标量 a:
transaCblasNoTranstransaCblasTrans或者transaCblasConjTransLayoutCblasColMajor矩阵大小lda∗klda*kLayoutCblasRowMajor矩阵大小lda∗mlda*m
lda : 引导维度
transaCblasNoTranstransaCblasTrans或者transaCblasConjTransLayoutCblasColMajorldalda至少为max(1,m)max(1,m)LayoutCblasRowMajorldalda至少为max(1,k)max(1,k)
b:
transaCblasNoTranstransaCblasTrans或者transaCblasConjTransLayoutCblasColMajor矩阵大小ldb∗nldb*nLayoutCblasRowMajor矩阵大小ldb∗kldb*k
ldb:
transaCblasNoTranstransaCblasTrans或者transaCblasConjTransLayoutCblasColMajorldbldb至少为max(1,k)max(1,k)LayoutCblasRowMajorldbldb至少为max(1,n)max(1,n)
beta: 标量
c: 当LayoutCblasColMajor时候,数组大小为lda∗nlda*n当LayoutCblasRowMajor时候,数组大小为lda∗mlda*m
ldc:当LayoutCblasColMajor的时候ldc必须至少为max(1,m)max(1,m);当LayoutCblasRowMajor的时候ldc必须至少为max(1,n)max(1,n)
输出参数: 将计算得到的矩阵写入到c
cblas_?hemm
作用 : 当一个输入矩阵为Hermitian时计算矩阵-矩阵的乘法定义函数 void cblas_chemm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zhemm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);运算 C:α∗A∗Bβ∗CC:α∗B∗Aβ∗CC:=\alpha*A*B+\beta*C\\C:=\alpha*B*A+\beta *C 其中α,β\alpha,\beta是标量AA是Hermitian矩阵,B,CB,C是m∗nm*n的矩阵
cblas_?herk
作用: Hermitian的k阶更新定义函数: void cblas_cherk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const float alpha, const void *a, const MKL_INT lda, const float beta, void *c, const MKL_INT ldc);void cblas_zherk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const double alpha, const void *a, const MKL_INT lda, const double beta, void *c, const MKL_INT ldc);运算 C:α∗A∗AHβ∗CC:α∗AH∗Aβ∗CC:=\alpha*A*A^H+\beta*C\\C:=\alpha*A^H*A+\beta*C 其中α,β\alpha,\beta是标量CC是n∗nn*n的Hermitian矩阵第一个式子的AA是n∗kn*k矩阵第二个式子的AA是k∗nk*n的矩阵
cblas_?herk2
作用: Hermitian矩阵的2阶更新定义函数 void cblas_cher2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const float beta, void *c, const MKL_INT ldc);void cblas_zher2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const double beta, void *c, const MKL_INT ldc);运算 C:α∗A∗BHconjg(α)∗B∗AHβ∗CC:α∗AH∗Bconjg(α)∗BH∗Aβ∗CC:=\alpha*A*B^H+conjg(\alpha)*B*A^H+\beta*C\\C:=\alpha*A^H*B+conjg(\alpha)*B^H*A+\beta*C 其中α,β\alpha,\beta是标量CC是n∗nn*n是Hermitian矩阵第一个式子中A,BA,B是n∗kn*k矩阵第二个式子中是k∗nk*n的矩阵
cblas_?symm
作用: 某个输入是对称矩阵时候计算矩阵-矩阵的乘法定义函数 void cblas_ssymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, 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_dsymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, 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);void cblas_csymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zsymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);运算 C:α∗A∗bβ∗CC:α∗B∗Aβ∗CC:=\alpha*A*b+\beta*C\\C:=\alpha*B*A+\beta*C 其中α,β\alpha,\beta是标量AA是对称阵,B,CB,C是m∗nm*n的矩阵
cblas_?syrk
作用: 对称矩阵的k阶更新定义函数 void cblas_ssyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const float alpha, const float *a, const MKL_INT lda, const float beta, float *c, const MKL_INT ldc);void cblas_dsyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const double alpha, const double *a, const MKL_INT lda, const double beta, double *c, const MKL_INT ldc);void cblas_csyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *beta, void *c, const MKL_INT ldc);void cblas_zsyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *beta, void *c, const MKL_INT ldc)运算 C:α∗A∗A′β∗CC:α∗A′∗Aβ∗CC:=\alpha*A*A’+\beta*C\\C:=\alpha*A'*A+\beta*C 其中,α,β\alpha,\beta是标量CC是n∗nn*n的对称阵,第一个式子中AA是n∗nn*n的矩阵第二个式子中AA是k∗nk*n的矩阵
cblas_?syr2k
作用: 对称阵的二阶更新定义函数 void cblas_ssyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, 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_dsyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, 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);void cblas_csyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zsyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const
CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);运算 C:α∗A∗B′α∗B∗A′β∗CC:α∗A′∗Bα∗B′∗Aβ∗CC := \alpha*A*B' + \alpha*B*A' + \beta*C\\C := \alpha*A'*B + \alpha*B'*A + \beta*C 其中,α,β\alpha,\beta是标量CC是n∗nn*n的对称阵第一个式子中A,BA,B是n∗kn*k的矩阵第二个式子中A,BA,B是k∗nk*n的矩阵
cblas_?trmm
作用: 某个输入矩阵为三角阵的时候计算矩阵-矩阵的乘法定义函数 void cblas_strmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const float alpha, const float *a, const MKL_INT lda, float *b, const MKL_INT ldb);void cblas_dtrmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const double alpha, const double *a, const MKL_INT lda, double *b, const MKL_INT ldb);void cblas_ctrmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);void cblas_ztrmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);运算 B:α∗op(A)∗BB:α∗B∗op(A)B := \alpha*op(A)*B\\B := \alpha*B*op(A) 其中α\alpha是标量BB是m∗nm*n的矩阵op(A)Aop(A)=A或者op(A)A′op(A)=A'或者op(A)conjg(A′)op(A)=conjg(A')
cblas_?trsm
作用: 解三角矩阵方程定义函数 void cblas_strsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const float alpha, const float *a, const MKL_INT lda, float *b, const MKL_INT ldb);void cblas_dtrsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const double alpha, const double *a, const MKL_INT lda, double *b, const MKL_INT ldb);void cblas_ctrsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);void cblas_ztrsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);运算 op(A)∗Xα∗BX∗op(A)alpha∗Bop(A)*X = \alpha*B\\X*op(A) = alpha*B 其中α\alpha是一个标量X和BX和B是一个m∗nm*n的矩阵AA是单位或者非单位,上三角或者下三角矩阵,op(A)=Aop(A)=A或者op(A)A′op(A)=A'或者op(A)conjg(A′)op(A)=conjg(A’)。把等式的解矩阵XX冲写入到BB矩阵中。
后续
研究BLAS Level 1 2 3中各种矩阵相关概念。随后是代码实现