mkl

转载https://blog.csdn.net/zb1165048017/article/details/70156844

命名规则

character + name + mod()

character

character说明
s实数域,单精度
c复数域,双精度
d实数域,双精度
z复数域,双精度

name

name说明
dot向量点乘
rot向量旋转
swap向量交换

矩阵参数类型

类型说明
ge一般矩阵
gb一般带状矩阵
sy对称矩阵
sp对称矩阵(压缩存储)
sb对称带状矩阵
he埃尔米特矩阵 Hermitian matrix
hp埃尔米特矩阵(压缩存储)
hb埃尔米特带状矩阵
tr三角矩阵
tp三角矩阵(压缩存储)
tb三角带状矩阵

mod

level1说明
c共轭向量
u非共轭向量
gGivens 旋转结构
m修正 Givens 旋转
mg修正 Givens 旋转结构
level2说明
mv矩阵-向量乘积
sv求解具有一个未知向量的线性方程组
r矩阵的一阶更新
r2矩阵的二阶更新
level3说明
mm矩阵-矩阵乘积
sm求解具有多个未知向量的线性方程组
rk矩阵的k阶更新
r2k矩阵的2k阶更新

矩阵存储方案

全部存储:比如将矩阵A存储到二维数组a中,矩阵元素Aij以列优先的方式存储到a[i+j∗lda]中,或者以行优先的形式存储到a[j+i∗lda]中。这里的lda就是数组的引导维度。
压缩存储:用于存储对称阵,埃尔米特矩阵,三角矩阵。对于列优先的布局,上三角和下三角按照列存储到一个一维数组;或者按照行优先的布局,上三角和下三角按行存储到一个一维数组中。
带状存储:带状矩阵被压缩存储到一个二维数组中。对于列优先布局,矩阵的列被存储到对应的数组列中,矩阵对角部分被存储到数组的特殊行中。对于行优先的布局,矩阵的行被存储到对应数组的行中,矩阵对角部分被存储到数组的指定行中。

函数说明

cblas_?asum()<s, d, sc, dz>

∑ i = 0 n ∣ x i ∗ i n c x ∣ \sum_{i=0}^n|{x_{i*incx}}| i=0nxiincx

/*求向量的绝对值和*/
/*
	n:向量个数
	x:向量x的起始位置
	incx:向量x的增量
*/
float cblas_sasum (const MKL_INT n, const float *x, const MKL_INT incx);
float cblas_scasum (const MKL_INT n, const void *x, const MKL_INT incx);
double cblas_dasum (const MKL_INT n, const double *x, const MKL_INT incx);
double cblas_dzasum (const MKL_INT n, const void *x, const MKL_INT incx);

cblas_?axpy()<s, d, c, z>

y i ∗ i n c y = a ∗ x i ∗ i n c x + y i ∗ i n c y y_{i*incy} = a*x_{i*incx} + y_{i*incy} yiincy=axiincx+yiincy

/*向量标量乘积*/
/*
	n:向量个数
	x:向量x的起始位置
	incx:向量x的增量
	y:向量y的起始位置
	incy:向量y的增量
*/
void cblas_saxpy (const MKL_INT n, const float a, const float *x, const MKL_INT incx, float *y, const MKL_INT incy);
void cblas_daxpy (const MKL_INT n, const double a, const double *x, const MKL_INT incx, double *y, const MKL_INT incy);
void cblas_caxpy (const MKL_INT n, const void *a, const void *x, const MKL_INT incx, void *y, const MKL_INT incy);
void cblas_zaxpy (const MKL_INT n, const void *a, const void *x, const MKL_INT incx, void *y, const MKL_INT incy);

cblas_?copy()<s, d, c, z>

y i ∗ i n c y = x i ∗ i n c x y_{i*incy} = x_{i*incx} yiincy=xiincx

/*复制*/
void cblas_scopy (const MKL_INT n, const float *x, const MKL_INT incx, float *y, const MKL_INT incy);
void cblas_dcopy (const MKL_INT n, const double *x, const MKL_INT incx, double *y, const MKL_INT incy);
void cblas_ccopy (const MKL_INT n, const void *x, const MKL_INT incx, void *y, const MKL_INT incy);
void cblas_zcopy (const MKL_INT n, const void *x, const MKL_INT incx, void *y, const MKL_INT incy);

cblas_?dot() <s,d>

∑ i n x i ∗ i n c x ∗ y i ∗ i n c y \sum_i^n{ x_{i*incx}*y_{i*incy}} inxiincxyiincy

/*计算点积*/
float cblas_sdot (const MKL_INT n, const float *x, const MKL_INT incx, const float *y, const MKL_INT incy);
double cblas_ddot (const MKL_INT n, const double *x, const MKL_INT incx, const double *y, const MKL_INT incy);
函数名缺失部分描述
cblas_?sdotsd,d双精度点乘
cblas_?dotcc,z共轭点乘
cblas_?dotuc,z非共轭点乘

cblas_?nrm2() <s,d,sc,dz>

∣ ∣ x ∣ ∣ 2 = ( ∑ i n ∣ x i ∣ 2 ) 1 2 ||x||_2 = (\sum_i^n{|x_i|^2})^{\frac{1}{2}} x2=(inxi2)21

/*L2 范数*/
float cblas_snrm2 (const MKL_INT n, const float *x, const MKL_INT incx);
double cblas_dnrm2 (const MKL_INT n, const double *x, const MKL_INT incx);
float cblas_scnrm2 (const MKL_INT n, const void *x, const MKL_INT incx);
double cblas_dznrm2 (const MKL_INT n, const void *x, const MKL_INT incx);

cblas_?rot() <s,d,cs,zd>

[ x i , y i ] = [ x i , y i ] [ c − s s c ] \begin{bmatrix} x_i,y_i \end{bmatrix} = \begin{bmatrix} x_i,y_i \end{bmatrix} \begin{bmatrix} c &amp;-s\\ s &amp; c\\ \end{bmatrix} [xi,yi]=[xi,yi][cssc]
x i ∗ i n c x = c ∗ x i ∗ i n c x + s ∗ y i ∗ i n c y x_{i*incx} = c*x_{i*incx} + s*y_{i*incy} xiincx=cxiincx+syiincy
y i ∗ i n c y = c ∗ y i ∗ i n c y − s ∗ x i ∗ i n c x y_{i*incy} = c*y_{i*incy} - s*x_{i*incx} yiincy=cyiincysxiincx

/*绕点旋转*/
void cblas_srot (const MKL_INT n, float *x, const MKL_INT incx, float *y, const MKL_INT incy, const float c, const float s);
void cblas_drot (const MKL_INT n, double *x, const MKL_INT incx, double *y, const MKL_INT incy, const double c, const double s);
void cblas_csrot (const MKL_INT n, void *x, const MKL_INT incx, void *y, const MKL_INT incy, const float c, const float s);
void cblas_zdrot (const MKL_INT n, void *x, const MKL_INT incx, void *y, const MKL_INT incy, const double c, const double s);
函数名缺少相说明
cblas_?rotg()<s,d,c,z>生成点的Givens旋转
cblas_?rotm()<s,d>点的修正Givens旋转
cblas_?rotmg()<s,d>生成点的修正Givens旋转

cblas_?scal() <s, d, c, z, cs, zd>

x i ∗ i n c x = a ∗ x i ∗ i n c x x_{i*incx} = a*x_{i*incx} xiincx=axiincx

//计算向量和标量的乘积
void cblas_sscal (const MKL_INT n, const float a, float *x, const MKL_INT incx);
void cblas_dscal (const MKL_INT n, const double a, double *x, const MKL_INT incx);
void cblas_cscal (const MKL_INT n, const void *a, void *x, const MKL_INT incx);
void cblas_zscal (const MKL_INT n, const void *a, void *x, const MKL_INT incx);
void cblas_csscal (const MKL_INT n, const float a, void *x, const MKL_INT incx);
void cblas_zdscal (const MKL_INT n, const double a, void *x, const MKL_INT incx);

cblas_?swap()<s, d, c, z>

/*交换向量*/
void cblas_sswap (const MKL_INT n, float *x, const MKL_INT incx, float *y, const MKL_INT incy);
void cblas_dswap (const MKL_INT n, double *x, const MKL_INT incx, double *y, const MKL_INT incy);
void cblas_cswap (const MKL_INT n, void *x, const MKL_INT incx, void *y, const MKL_INT incy);
void cblas_zswap (const MKL_INT n, void *x, const MKL_INT incx, void *y, const MKL_INT incy);

cblas_i?amax()<s, d, c, z>

/*绝对值最大元素位置*/
CBLAS_INDEX cblas_isamax (const MKL_INT n, const float *x, const MKL_INT incx);
CBLAS_INDEX cblas_idamax (const MKL_INT n, const double *x, const MKL_INT incx);
CBLAS_INDEX cblas_icamax (const MKL_INT n, const void *x, const MKL_INT incx);    
CBLAS_INDEX cblas_izamax (const MKL_INT n, const void *x, const MKL_INT incx);

cblas_i?amin() <s, d, c, z>

/*返回的是向量的最小绝对值的位置*/
CBLAS_INDEX cblas_isamin (const MKL_INT n, const float *x, const MKL_INT incx);
CBLAS_INDEX cblas_idamin (const MKL_INT n, const double *x, const MKL_INT incx);
CBLAS_INDEX cblas_icamin (const MKL_INT n, const void *x, const MKL_INT incx);
CBLAS_INDEX cblas_izamin (const MKL_INT n, const void *x, const MKL_INT incx);

cblas_?cabs1() <s,d>

r e s = ∣ R e ( z ) ∣ + ∣ I m ( z ) ∣ res = |Re(z)| +|Im(z)| res=Re(z)+Im(z)

/*计算复数绝对值*/
float cblas_scabs1 (const void *z);
double cblas_dcabs1 (const void *z);

矩阵

cblas_?gemm()<s,d>

C = α A t r a n s A ∗ B t r a n s B + β ∗ C C = \alpha A^{transA}*B^{transB} + \beta *C C=αAtransABtransB+βC
A t r a n s A ∈ R M × K A^{transA}\in R^{M \times K} AtransARM×K
B t r a n s B ∈ R K × N B^{transB}\in R^{K \times N} BtransBRK×N
C ∈ R M × N C\in R^{M \times N} CRM×N

/*
order:行优先或者列优先
transA:A是否转置
transB:B是否转置
M,N,K分别为对应的维度(如果转置,则代表转置后的维度)
LDA,LDB,LDC:LDA和LDB是对应矩阵还没转置之前,在主维度方向的维度。(如果是行优先就是列数)
ALPHA,BETA:相关系数
BETA:
*/
void cblas_sgemm(order, transA, transB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC);

cblas_?gemv()<s,d>

Y = α ∗ A T r a n s A X + β Y Y= \alpha*A^{TransA}X + \beta Y Y=αATransAX+βY

/*
CBLAS_ORDER __Order:行优先还是列优先
CBLAS_TRANSPOSE __TransA:A是否转置
__M:A的行数
__N:A的列数
__alpha:因子
__A:矩阵
__lda:A还没转置之前,在主维度方向的维度。(如果是行优先就是列数)
__X:向量X
__incX:X的增量
__beta:因子
__Y:向量Y
__incY:增量
*/
void cblas_sgemv(const enum CBLAS_ORDER __Order, const enum CBLAS_TRANSPOSE __TransA, const int __M, const int __N, const float __alpha, const float *__A, const int __lda, const float *__X, const int __incX, const float __beta, float *__Y, const int __incY);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值