MKL——常用函数说明

Intel MKL,全称 Intel Math Kernel Library,提供经过高度优化和大量线程化处理的数学例程,面向性能要求极高的科学、工程及金融等领域的应用。MKL是一款商用函数库,提供C、Fortran 和 Fortran 95的支持,但仅支持Intel自家旗下的CPU。

在Intel CPU上,MKL的性能要远高于Eigen, 虽然OpenBLAS和其差距不是太大,但OpenBLAS提供的函数太少。

下面,简单介绍一些C环境下常用的MKL矩阵运算函数。主要使用单精度浮点数据操作

字符关键字

数据类型关键字:

<span style="color:#000000"><code>s: real, single <span style="color:#000088">precision</span>,实数单精度

c: complex, single <span style="color:#000088">precision</span>,复数单精度

d: real, <span style="color:#000088">double</span> <span style="color:#000088">precision</span>,实数双精度

z: complex, <span style="color:#000088">double</span> <span style="color:#000088">precision</span>,复数双精度</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

常用矩阵类型关键字:

<span style="color:#000000"><code>ge: general <span style="color:#000088">matrix</span>,一般矩阵

gb: general band <span style="color:#000088">matrix</span>,一般带状矩阵

sy: symmetric <span style="color:#000088">matrix</span>,对称矩阵
sp: symmetric <span style="color:#000088">matrix</span> (packed storage)
sb: symmetric band <span style="color:#000088">matrix</span>

tr: triangular <span style="color:#000088">matrix</span>,三角阵
tp: triangular <span style="color:#000088">matrix</span> (packed storage)
tb: triangular band <span style="color:#000088">matrix</span>.</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

常用操作类型关键字:

<span style="color:#000000"><code>mv: <span style="color:#009900">matrix-vector product,矩阵向量乘积</span>

sv: solving a <span style="color:#000088">system</span> of linear equations with a single unknown vector

mm: matrix-matrix product,矩阵矩阵乘积

sm: solving a <span style="color:#000088">system</span> of linear equations with multiple unknown vectors</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

举例说明:

<span style="color:#000000"><code>cblas_sgemm :

s: 单精度浮点数<span style="color:#880000">;</span>
ge: 一般矩阵<span style="color:#880000">;</span>
mm: 矩阵矩阵乘法<span style="color:#880000">;</span></code></span>
  • 1
  • 2
  • 3
  • 4
  • 5

全局枚举变量定义

列出几个最常用到的,MKL已经定义的枚举变量类型:

<span style="color:#000000"><code class="language-c++"><span style="color:#880000">//行主序 or 列主序</span>
<span style="color:#000088">enum</span> <span style="color:#009900">CBLAS_LAYOUT</span> {
CblasRowMajor=<span style="color:#006666">101</span>, <span style="color:#880000">/* row-major arrays */</span>
CblasColMajor=<span style="color:#006666">102</span>}; <span style="color:#880000">/* column-major arrays */</span>

<span style="color:#880000">// 不转置 or 转置 or 共轭</span>
<span style="color:#000088">enum</span> <span style="color:#009900">CBLAS_TRANSPOSE</span> {
CblasNoTrans=<span style="color:#006666">111</span>, <span style="color:#880000">/* trans='N' */</span>
CblasTrans=<span style="color:#006666">112</span>, <span style="color:#880000">/* trans='T' */</span>
CblasConjTrans=<span style="color:#006666">113</span>}; <span style="color:#880000">/* trans='C' */</span></code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

矩阵矩阵乘法

头文件:mkl.h

函数实现功能: C := alpha*op(A)*op(B) + beta*C

参数维度说明: alpha 和 beta为标量,A为矩阵(m*k),B为矩阵(k*n),C为矩阵(m*n)

函数接口:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">void</span> cblas_sgemm (<span style="color:#000088">const</span> CBLAS_LAYOUT Layout, 
                  <span style="color:#000088">const</span> CBLAS_TRANSPOSE transa, 
                  <span style="color:#000088">const</span> CBLAS_TRANSPOSE transb, 
                  <span style="color:#000088">const</span> MKL_INT m, 
                  <span style="color:#000088">const</span> MKL_INT n, 
                  <span style="color:#000088">const</span> MKL_INT k, 
                  <span style="color:#000088">const</span> <span style="color:#000088">float</span> alpha, 
                  <span style="color:#000088">const</span> <span style="color:#000088">float</span> *a, 
                  <span style="color:#000088">const</span> MKL_INT lda, 
                  <span style="color:#000088">const</span> <span style="color:#000088">float</span> *b, 
                  <span style="color:#000088">const</span> MKL_INT ldb, 
                  <span style="color:#000088">const</span> <span style="color:#000088">float</span> beta, 
                  <span style="color:#000088">float</span> *c, 
                  <span style="color:#000088">const</span> MKL_INT ldc);</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

参数说明:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">const</span> CBLAS_LAYOUT Layout: 矩阵主序,默认行主序CblasRowMajor
<span style="color:#000088">const</span> CBLAS_TRANSPOSE transa:矩阵A是否转置,op(A),默认不转置CblasNoTrans
<span style="color:#000088">const</span> CBLAS_TRANSPOSE transb:矩阵B是否转置,op(B),默认不转置CblasNoTrans 

<span style="color:#000088">const</span> MKL_INT m:A的行数
<span style="color:#000088">const</span> MKL_INT n:B的列数
<span style="color:#000088">const</span> MKL_INT k:A的列数,即A*B ~ (m*k) * (k*n)

<span style="color:#000088">const</span> <span style="color:#000088">float</span> alpha: 乘法系数
<span style="color:#000088">const</span> <span style="color:#000088">float</span> *a: 矩阵A的内存地址
<span style="color:#000088">const</span> MKL_INT lda:A不转置,则为A的列数;否则为A的行数

<span style="color:#000088">const</span> <span style="color:#000088">float</span> *b: 矩阵B的内存地址
<span style="color:#000088">const</span> MKL_INT ldb:B不转置,则为B的列数;否则为B的行数

<span style="color:#000088">const</span> <span style="color:#000088">float</span> beta: 乘法系数 
<span style="color:#000088">float</span> *c: 矩阵C的内存地址 
<span style="color:#000088">const</span> MKL_INT ldc):C的列数,显然列数为n</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

矩阵向量乘法

头文件:mkl.h

函数实现功能: y := alpha*op(A)*x + beta*y

参数维度说明: alpha 和 beta为标量,A为矩阵(m*n),x和y为向量(n*1)

函数接口:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">void</span> cblas_sgemv (<span style="color:#000088">const</span> CBLAS_LAYOUT Layout, 
                  <span style="color:#000088">const</span> CBLAS_TRANSPOSE trans, 
                  <span style="color:#000088">const</span> MKL_INT m, 
                  <span style="color:#000088">const</span> MKL_INT n, 
                  <span style="color:#000088">const</span> <span style="color:#000088">float</span> alpha, 
                  <span style="color:#000088">const</span> <span style="color:#000088">float</span> *a, 
                  <span style="color:#000088">const</span> MKL_INT lda, 
                  <span style="color:#000088">const</span> <span style="color:#000088">float</span> *x, 
                  <span style="color:#000088">const</span> MKL_INT incx, 
                  <span style="color:#000088">const</span> <span style="color:#000088">float</span> beta, 
                  <span style="color:#000088">float</span> *y, 
                  <span style="color:#000088">const</span> MKL_INT incy);</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

参数说明:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">const</span> CBLAS_LAYOUT Layout:矩阵A主序设置,默认行主序CblasRowMajor
<span style="color:#000088">const</span> CBLAS_TRANSPOSE trans:矩阵A是否转置,op(A),默认不转置CblasNoTrans
<span style="color:#000088">const</span> MKL_INT m:A的行数
<span style="color:#000088">const</span> MKL_INT n:B的列数 

<span style="color:#000088">const</span> <span style="color:#000088">float</span> alpha: 乘法系数
<span style="color:#000088">const</span> <span style="color:#000088">float</span> *a: 矩阵A的内存地址
<span style="color:#000088">const</span> MKL_INT lda:A不转置,则为A的列数;否则为A的行数

<span style="color:#000088">const</span> <span style="color:#000088">float</span> *x:矢量x的内存地址
<span style="color:#000088">const</span> MKL_INT incx: 矢量x的取样间隔,该值必须大于<span style="color:#006666">0</span>,常设为<span style="color:#006666">1</span> 

<span style="color:#000088">const</span> <span style="color:#000088">float</span> beta, 
<span style="color:#000088">float</span> *y:矢量y的内存地址 
<span style="color:#000088">const</span> MKL_INT incy: 矢量y的取样间隔,该值必须大于<span style="color:#006666">0</span>,常设为<span style="color:#006666">1</span> </code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

向量乘法1

头文件:mkl.h

函数实现功能: y := a*x + b*y

参数维度说明: a和 b为标量,x和y为向量(n*1)

函数接口:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">void</span> cblas_saxpby (<span style="color:#000088">const</span> MKL_INT n, 
                   <span style="color:#000088">const</span> <span style="color:#000088">float</span> a, 
                   <span style="color:#000088">const</span> <span style="color:#000088">float</span> *x, 
                   <span style="color:#000088">const</span> MKL_INT incx,
                   <span style="color:#000088">const</span> <span style="color:#000088">float</span> b, 
                   <span style="color:#000088">float</span> *y, 
                   <span style="color:#000088">const</span> MKL_INT incy);</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

参数说明:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">const</span> MKL_INT n:向量元素个数
<span style="color:#000088">const</span> <span style="color:#000088">float</span> a, 
<span style="color:#000088">const</span> <span style="color:#000088">float</span> *x, 
<span style="color:#000088">const</span> <span style="color:#000088">float</span> *x:矢量x的内存地址
<span style="color:#000088">const</span> MKL_INT incx: 矢量x的取样间隔,该值必须大于<span style="color:#006666">0</span>,常设为<span style="color:#006666">1</span> 
<span style="color:#000088">const</span> <span style="color:#000088">float</span> b:
<span style="color:#000088">float</span> *y:矢量y的内存地址 
<span style="color:#000088">const</span> MKL_INT incy: 矢量y的取样间隔,该值必须大于<span style="color:#006666">0</span>,常设为<span style="color:#006666">1</span> </code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

向量乘法2

头文件:mkl.h

函数实现功能: y := a*x + y

参数维度说明: a标量,x和y为向量(n*1)

函数接口:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">void</span> cblas_saxpby (<span style="color:#000088">const</span> MKL_INT n, 
                   <span style="color:#000088">const</span> <span style="color:#000088">float</span> a, 
                   <span style="color:#000088">const</span> <span style="color:#000088">float</span> *x, 
                   <span style="color:#000088">const</span> MKL_INT incx,
                   <span style="color:#000088">float</span> *y, 
                   <span style="color:#000088">const</span> MKL_INT incy);</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

参数说明:请参照向量乘法1。

向量元素加减乘除

头文件:mkl.h

函数实现功能: y[i] = a[i] {+ - * /} b[i]

参数维度说明: a、b和y为向量(n*1)

函数接口:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">void</span> vsAdd( <span style="color:#000088">const</span> MKL_INT n, 
           <span style="color:#000088">const</span> <span style="color:#000088">float</span>*a, 
           <span style="color:#000088">const</span> <span style="color:#000088">float</span>*a,
           <span style="color:#000088">float</span>*y );</code></span>
  • 1
  • 2
  • 3
  • 4

减法则为:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">void</span> vsSub( <span style="color:#000088">const</span> MKL_INT n, <span style="color:#000088">const</span> <span style="color:#000088">float</span>*a,<span style="color:#000088">const</span> <span style="color:#000088">float</span>*b,<span style="color:#000088">float</span>*y );</code></span>
  • 1

乘法则为:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">void</span> vsMul( <span style="color:#000088">const</span> MKL_INT n, <span style="color:#000088">const</span> <span style="color:#000088">float</span>*a,<span style="color:#000088">const</span> <span style="color:#000088">float</span>*b,<span style="color:#000088">float</span>*y );</code></span>
  • 1

除法则为:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">void</span> vsDiv( <span style="color:#000088">const</span> MKL_INT n, <span style="color:#000088">const</span> <span style="color:#000088">float</span>*a,<span style="color:#000088">const</span> <span style="color:#000088">float</span>*b,<span style="color:#000088">float</span>*y );</code></span>
  • 1

向量scale运算

头文件:mkl.h

函数实现功能: x = a*x

参数维度说明: a为标量,x为向量(n*1)

函数接口:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">void</span> cblas_sscal (<span style="color:#000088">const</span> MKL_INT n, 
                  <span style="color:#000088">const</span> <span style="color:#000088">float</span> a, 
                  <span style="color:#000088">float</span> *x, 
                  <span style="color:#000088">const</span> MKL_INT incx);</code></span>
  • 1
  • 2
  • 3
  • 4

数据copy

头文件:mkl.h

函数实现功能: y = x

参数维度说明: x和y为向量(n*1)(矩阵也可以看做向量)

函数接口:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">void</span> cblas_saxpby (<span style="color:#000088">const</span> MKL_INT n, 
                   <span style="color:#000088">const</span> <span style="color:#000088">float</span> *x, 
                   <span style="color:#000088">const</span> MKL_INT incx,
                   <span style="color:#000088">float</span> *y, 
                   <span style="color:#000088">const</span> MKL_INT incy);</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5

参数说明:请参照向量乘法1。

指数运算

头文件:mkl.h

函数实现功能: y = exp(x)

参数维度说明: x和y为向量(n*1)(矩阵也可以看做向量)

函数接口:

<span style="color:#000000"><code class="language-c++">vsExp( <span style="color:#000088">const</span> MKL_INT n,
       <span style="color:#000088">const</span> <span style="color:#000088">float</span>*a, 
       <span style="color:#000088">float</span>*y );</code></span>
  • 1
  • 2
  • 3

关于特殊值的运算说明:

具体参照下表:

EXP

求和运算

头文件:mkl.h

函数实现功能: y=∑xy=∑x

参数维度说明: x和y为向量(n*1)(矩阵也可以看做向量)

函数接口:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">float</span> cblas_sasum (<span style="color:#000088">const</span> MKL_INT n, 
                   <span style="color:#000088">const</span> <span style="color:#000088">float</span> *x, 
                   <span style="color:#000088">const</span> MKL_INT incx);</code></span>
  • 1
  • 2
  • 3

参数说明:

<span style="color:#000000"><code class="language-c++"><span style="color:#000088">const</span> MKL_INT n: 向量中元素个数
<span style="color:#000088">const</span> <span style="color:#000088">float</span> *x: 向量在内存中的地址
<span style="color:#000088">const</span> MKL_INT incx : 矢量x的取样间隔,该值必须大于<span style="color:#006666">0</span>,常设为<span style="color:#006666">1</span> </code></span>

猜你喜欢

转载自blog.csdn.net/sinat_41625153/article/details/81328639