Intel MKL,全称 Intel Math Kernel Library,提供经过高度优化和大量线程化处理的数学例程,面向性能要求极高的科学、工程及金融等领域的应用。MKL是一款商用函数库,提供C、Fortran 和 Fortran 95的支持,但仅支持Intel自家旗下的CPU。
在Intel CPU上,MKL的性能要远高于Eigen, 虽然OpenBLAS和其差距不是太大,但OpenBLAS提供的函数太少。
下面,简单介绍一些C环境下常用的MKL矩阵运算函数。主要使用单精度浮点数据操作
字符关键字
数据类型关键字:
s: real, single precision,实数单精度
c: complex, single precision,复数单精度
d: real, double precision,实数双精度
z: complex, double precision,复数双精度
常用矩阵类型关键字:
ge: general matrix,一般矩阵
gb: general band matrix,一般带状矩阵
sy: symmetric matrix,对称矩阵
sp: symmetric matrix (packed storage)
sb: symmetric band matrix
tr: triangular matrix,三角阵
tp: triangular matrix (packed storage)
tb: triangular band matrix.
常用操作类型关键字:
mv: matrix-vector product,矩阵向量乘积
sv: solving a system of linear equations with a single unknown vector
mm: matrix-matrix product,矩阵矩阵乘积
sm: solving a system of linear equations with multiple unknown vectors
举例说明:
cblas_sgemm :
s: 单精度浮点数;
ge: 一般矩阵;
mm: 矩阵矩阵乘法;
全局枚举变量定义
列出几个最常用到的,MKL已经定义的枚举变量类型:
//行主序 or 列主序
enum CBLAS_LAYOUT {
CblasRowMajor=101, /* row-major arrays */
CblasColMajor=102}; /* column-major arrays */
// 不转置 or 转置 or 共轭
enum CBLAS_TRANSPOSE {
CblasNoTrans=111, /* trans='N' */
CblasTrans=112, /* trans='T' */
CblasConjTrans=113}; /* trans='C' */
矩阵矩阵乘法
头文件:mkl.h
函数实现功能: C := alpha*op(A)*op(B) + beta*C
参数维度说明: alpha 和 beta为标量,A为矩阵(m*k),B为矩阵(k*n),C为矩阵(m*n)
函数接口:
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);
参数说明:
const CBLAS_LAYOUT Layout: 矩阵主序,默认行主序CblasRowMajor
const CBLAS_TRANSPOSE transa:矩阵A是否转置,op(A),默认不转置CblasNoTrans
const CBLAS_TRANSPOSE transb:矩阵B是否转置,op(B),默认不转置CblasNoTrans
const MKL_INT m:A的行数
const MKL_INT n:B的列数
const MKL_INT k:A的列数,即A*B ~ (m*k) * (k*n)
const float alpha: 乘法系数
const float *a: 矩阵A的内存地址
const MKL_INT lda:A不转置,则为A的列数;否则为A的行数
const float *b: 矩阵B的内存地址
const MKL_INT ldb:B不转置,则为B的列数;否则为B的行数
const float beta: 乘法系数
float *c: 矩阵C的内存地址
const MKL_INT ldc):C的列数,显然列数为n
矩阵向量乘法
头文件:mkl.h
函数实现功能: y := alpha*op(A)*x + beta*y
参数维度说明: alpha 和 beta为标量,A为矩阵(m*n),x和y为向量(n*1)
函数接口:
void cblas_sgemv (const CBLAS_LAYOUT Layout,
const CBLAS_TRANSPOSE trans,
const MKL_INT m,
const MKL_INT n,
const float alpha,
const float *a,
const MKL_INT lda,
const float *x,
const MKL_INT incx,
const float beta,
float *y,
const MKL_INT incy);
参数说明:
const CBLAS_LAYOUT Layout:矩阵A主序设置,默认行主序CblasRowMajor
const CBLAS_TRANSPOSE trans:矩阵A是否转置,op(A),默认不转置CblasNoTrans
const MKL_INT m:A的行数
const MKL_INT n:B的列数
const float alpha: 乘法系数
const float *a: 矩阵A的内存地址
const MKL_INT lda:A不转置,则为A的列数;否则为A的行数
const float *x:矢量x的内存地址
const MKL_INT incx: 矢量x的取样间隔,该值必须大于0,常设为1
const float beta,
float *y:矢量y的内存地址
const MKL_INT incy: 矢量y的取样间隔,该值必须大于0,常设为1
向量乘法1
头文件:mkl.h
函数实现功能: y := a*x + b*y
参数维度说明: a和 b为标量,x和y为向量(n*1)
函数接口:
void cblas_saxpby (const MKL_INT n,
const float a,
const float *x,
const MKL_INT incx,
const float b,
float *y,
const MKL_INT incy);
参数说明:
const MKL_INT n:向量元素个数
const float a,
const float *x,
const float *x:矢量x的内存地址
const MKL_INT incx: 矢量x的取样间隔,该值必须大于0,常设为1
const float b:
float *y:矢量y的内存地址
const MKL_INT incy: 矢量y的取样间隔,该值必须大于0,常设为1
向量乘法2
头文件:mkl.h
函数实现功能: y := a*x + y
参数维度说明: a标量,x和y为向量(n*1)
函数接口:
void cblas_saxpby (const MKL_INT n,
const float a,
const float *x,
const MKL_INT incx,
float *y,
const MKL_INT incy);
参数说明:请参照向量乘法1。
向量元素加减乘除
头文件:mkl.h
函数实现功能: y[i] = a[i] {+ - * /} b[i]
参数维度说明: a、b和y为向量(n*1)
函数接口:
void vsAdd( const MKL_INT n,
const float*a,
const float*a,
float*y );
减法则为:
void vsSub( const MKL_INT n, const float*a,const float*b,float*y );
乘法则为:
void vsMul( const MKL_INT n, const float*a,const float*b,float*y );
除法则为:
void vsDiv( const MKL_INT n, const float*a,const float*b,float*y );
向量scale运算
头文件:mkl.h
函数实现功能: x = a*x
参数维度说明: a为标量,x为向量(n*1)
函数接口:
void cblas_sscal (const MKL_INT n,
const float a,
float *x,
const MKL_INT incx);
数据copy
头文件:mkl.h
函数实现功能: y = x
参数维度说明: x和y为向量(n*1)(矩阵也可以看做向量)
函数接口:
void cblas_saxpby (const MKL_INT n,
const float *x,
const MKL_INT incx,
float *y,
const MKL_INT incy);
参数说明:请参照向量乘法1。
指数运算
头文件:mkl.h
函数实现功能: y = exp(x)
参数维度说明: x和y为向量(n*1)(矩阵也可以看做向量)
函数接口:
vsExp( const MKL_INT n,
const float*a,
float*y );
关于特殊值的运算说明:
具体参照下表:
求和运算
头文件:mkl.h
函数实现功能: \(y = \sum{x}\)
参数维度说明: x和y为向量(n*1)(矩阵也可以看做向量)
函数接口:
float cblas_sasum (const MKL_INT n,
const float *x,
const MKL_INT incx);
参数说明:
const MKL_INT n: 向量中元素个数
const float *x: 向量在内存中的地址
const MKL_INT incx : 矢量x的取样间隔,该值必须大于0,常设为1