转载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 | 非共轭向量 |
g | Givens 旋转结构 |
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=0n∣xi∗incx∣
/*求向量的绝对值和*/
/*
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} yi∗incy=a∗xi∗incx+yi∗incy
/*向量标量乘积*/
/*
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} yi∗incy=xi∗incx
/*复制*/
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}} ∑inxi∗incx∗yi∗incy
/*计算点积*/
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_?sdot | sd,d | 双精度点乘 |
cblas_?dotc | c,z | 共轭点乘 |
cblas_?dotu | c,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}} ∣∣x∣∣2=(∑in∣xi∣2)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 &-s\\ s & c\\ \end{bmatrix}
[xi,yi]=[xi,yi][cs−sc]
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}
xi∗incx=c∗xi∗incx+s∗yi∗incy
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}
yi∗incy=c∗yi∗incy−s∗xi∗incx
/*绕点旋转*/
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} xi∗incx=a∗xi∗incx
//计算向量和标量的乘积
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=αAtransA∗BtransB+β∗C
A
t
r
a
n
s
A
∈
R
M
×
K
A^{transA}\in R^{M \times K}
AtransA∈RM×K
B
t
r
a
n
s
B
∈
R
K
×
N
B^{transB}\in R^{K \times N}
BtransB∈RK×N
C
∈
R
M
×
N
C\in R^{M \times N}
C∈RM×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);