MKL学习——矩阵矩阵操作
前言
前面介紹了BLAS Level 1中向量-向量操作,以及BLAS Level 2中矩陣-向量的操作,就剩下這一篇的BLAS Level 3中的矩陣-矩陣的操作了。對(duì)稀疏矩陣的操作以后等要用再看看。對(duì)基本的矩陣和向量運(yùn)算的函數(shù)有所了解以后,就進(jìn)行常用參數(shù)分析,以及實(shí)現(xiàn)了。
所有函數(shù)概覽
| cblas_?gemm | s,d,c,z | 一般矩陣的矩陣-矩陣乘法 |
| cblas_?hemm | c,z | 某個(gè)輸入矩陣是Hermitian,然后計(jì)算矩陣-矩陣乘法 |
| cblas_?herk | c,z | Hermitian的k階更新 |
| cblas_?herk2 | c,z | Hermitian的2k階更新 |
| cblas_?symm | s,d,c,z | 某個(gè)輸入矩陣是對(duì)稱的,然后計(jì)算矩陣-矩陣乘法 |
| cblas_?syrk | s,d,c,z | 對(duì)稱矩陣的k階更新 |
| cblas_?syr2k | s,d,c,z | 對(duì)稱矩陣的2k階更新 |
| cblas_?trmm | s,d,c,z | 某個(gè)輸入矩陣是三角的,就是你矩陣-矩陣的乘法 |
| cblas_?trsm | s,d,c,z | 解三角矩陣方程 |
矩陣運(yùn)算
cblas_?gemm
作用 : 一般矩陣的矩陣-矩陣乘法
定義函數(shù)
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);void cblas_dgemm (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 double alpha, const double *a, const MKL_INT lda, const double *b, const MKL_INT ldb, const double beta, double *c, const MKL_INT ldc);void cblas_cgemm (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 void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zgemm (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 void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);運(yùn)算
C:=α?op(A)?op(B)+β?C
其中op(x)可以是op(x)=x或者op(x)=xT或者op(x)=XHα和β是標(biāo)量
A,B,C是矩陣: op(A)是一個(gè)m?k的矩陣,op(B)是k?n的矩陣,C是一個(gè)m?n的矩陣
輸入?yún)?shù)
Layout: 指定矩陣是行優(yōu)先(CblasRowMajor)還是列優(yōu)先(CblasColMajor)
transa: 指定對(duì)矩陣的操作op(A),如果transa=CblasNoTrans那么op(A)=A;如果transa=CblasTrans那么op(A)=AT;如果transa=CblasConjTrans那么op(A)=AH
transb: 同上
m: 矩陣op(A)和C的行數(shù)
n: 矩陣op(B)和C的列數(shù)
k: 矩陣op(A)和op(B)的列數(shù)
alpha: 標(biāo)量
a:
| Layout=CblasColMajor | 矩陣大小lda?k |
| Layout=CblasRowMajor | 矩陣大小lda?m |
lda : 引導(dǎo)維度
| Layout=CblasColMajor | lda至少為max(1,m) |
| Layout=CblasRowMajor | lda至少為max(1,k) |
b:
| Layout=CblasColMajor | 矩陣大小ldb?n |
| Layout=CblasRowMajor | 矩陣大小ldb?k |
ldb:
| Layout=CblasColMajor | ldb至少為max(1,k) |
| Layout=CblasRowMajor | ldb至少為max(1,n) |
beta: 標(biāo)量
c: 當(dāng)Layout=CblasColMajor時(shí)候,數(shù)組大小為lda?n;當(dāng)Layout=CblasRowMajor時(shí)候,數(shù)組大小為lda?m
ldc:當(dāng)Layout=CblasColMajor的時(shí)候,ldc必須至少為max(1,m);當(dāng)Layout=CblasRowMajor的時(shí)候,ldc必須至少為max(1,n)
- 輸出參數(shù): 將計(jì)算得到的矩陣寫入到c
cblas_?hemm
作用 : 當(dāng)一個(gè)輸入矩陣為Hermitian時(shí),計(jì)算矩陣-矩陣的乘法
定義函數(shù)
void cblas_chemm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zhemm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);運(yùn)算
C:=α?A?B+β?CC:=α?B?A+β?C
其中,α,β是標(biāo)量,A是Hermitian矩陣,B,C是m?n的矩陣
cblas_?herk
作用: Hermitian的k階更新
定義函數(shù):
void cblas_cherk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const float alpha, const void *a, const MKL_INT lda, const float beta, void *c, const MKL_INT ldc);void cblas_zherk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const double alpha, const void *a, const MKL_INT lda, const double beta, void *c, const MKL_INT ldc);運(yùn)算
C:=α?A?AH+β?CC:=α?AH?A+β?C
其中,α,β是標(biāo)量,C是n?n的Hermitian矩陣,第一個(gè)式子的A是n?k矩陣,第二個(gè)式子的A是k?n的矩陣
cblas_?herk2
作用: Hermitian矩陣的2階更新
定義函數(shù)
void cblas_cher2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const float beta, void *c, const MKL_INT ldc);void cblas_zher2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const double beta, void *c, const MKL_INT ldc);運(yùn)算
C:=α?A?BH+conjg(α)?B?AH+β?CC:=α?AH?B+conjg(α)?BH?A+β?C
其中,α,β是標(biāo)量,C是n?n是Hermitian矩陣,第一個(gè)式子中A,B是n?k矩陣,第二個(gè)式子中是k?n的矩陣
cblas_?symm
作用: 某個(gè)輸入是對(duì)稱矩陣時(shí)候,計(jì)算矩陣-矩陣的乘法
定義函數(shù)
void cblas_ssymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, 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);void cblas_dsymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const double alpha, const double *a, const MKL_INT lda, const double *b, const MKL_INT ldb, const double beta, double *c, const MKL_INT ldc);void cblas_csymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zsymm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);運(yùn)算
C:=α?A?b+β?CC:=α?B?A+β?C
其中α,β是標(biāo)量,A是對(duì)稱陣,B,C是m?n的矩陣
cblas_?syrk
作用: 對(duì)稱矩陣的k階更新
定義函數(shù)
void cblas_ssyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const float alpha, const float *a, const MKL_INT lda, const float beta, float *c, const MKL_INT ldc);void cblas_dsyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const double alpha, const double *a, const MKL_INT lda, const double beta, double *c, const MKL_INT ldc);void cblas_csyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *beta, void *c, const MKL_INT ldc);void cblas_zsyrk (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *beta, void *c, const MKL_INT ldc)運(yùn)算
C:=α?A?A′+β?CC:=α?A′?A+β?C
其中,α,β是標(biāo)量,C是n?n的對(duì)稱陣,第一個(gè)式子中A是n?n的矩陣,第二個(gè)式子中A是k?n的矩陣
cblas_?syr2k
作用: 對(duì)稱陣的二階更新
定義函數(shù)
void cblas_ssyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, 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);void cblas_dsyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const double alpha, const double *a, const MKL_INT lda, const double *b, const MKL_INT ldb, const double beta, double *c, const MKL_INT ldc);void cblas_csyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);void cblas_zsyr2k (const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE trans, const MKL_INT n, const MKL_INT k, const void *alpha, const void *a, const MKL_INT lda, const void *b, const MKL_INT ldb, const void *beta, void *c, const MKL_INT ldc);運(yùn)算
C:=α?A?B′+α?B?A′+β?CC:=α?A′?B+α?B′?A+β?C
其中,α,β是標(biāo)量,C是n?n的對(duì)稱陣,第一個(gè)式子中A,B是n?k的矩陣,第二個(gè)式子中A,B是k?n的矩陣
cblas_?trmm
作用: 某個(gè)輸入矩陣為三角陣的時(shí)候,計(jì)算矩陣-矩陣的乘法
定義函數(shù)
void cblas_strmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const float alpha, const float *a, const MKL_INT lda, float *b, const MKL_INT ldb);void cblas_dtrmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const double alpha, const double *a, const MKL_INT lda, double *b, const MKL_INT ldb);void cblas_ctrmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);void cblas_ztrmm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);運(yùn)算
B:=α?op(A)?BB:=α?B?op(A)
其中,α是標(biāo)量,B是m?n的矩陣,op(A)=A或者op(A)=A′或者op(A)=conjg(A′)
cblas_?trsm
作用: 解三角矩陣方程
定義函數(shù)
void cblas_strsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const float alpha, const float *a, const MKL_INT lda, float *b, const MKL_INT ldb);void cblas_dtrsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const double alpha, const double *a, const MKL_INT lda, double *b, const MKL_INT ldb);void cblas_ctrsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);void cblas_ztrsm (const CBLAS_LAYOUT Layout, const CBLAS_SIDE side, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_DIAG diag, const MKL_INT m, const MKL_INT n, const void *alpha, const void *a, const MKL_INT lda, void *b, const MKL_INT ldb);運(yùn)算
op(A)?X=α?BX?op(A)=alpha?B
其中,α是一個(gè)標(biāo)量,X和B是一個(gè)m?n的矩陣,A是單位或者非單位,上三角或者下三角矩陣,op(A)=A或者op(A)=A′或者op(A)=conjg(A′)。把等式的解矩陣X沖寫入到B矩陣中。
后續(xù)
研究BLAS Level 1 2 3中各種矩陣相關(guān)概念。隨后是代碼實(shí)現(xiàn)
總結(jié)
以上是生活随笔為你收集整理的MKL学习——矩阵矩阵操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 工商银行信用卡激活期限是多久?取决于申卡
- 下一篇: 工商银行附属卡年费多少?怎么免年费?