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
關於特殊值的運算說明:
具體參照下表:
求和運算
標頭檔案: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>