cblas_sgemm 原始碼講解
阿新 • • 發佈:2019-02-07
1:函式原型:
cblas_sgemm(order,transA,transB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC);
函式作用:C=alpha*A*B+beta*C
alpha =1,beta =0 的情況下,等於兩個矩陣相成。
第一引數 oreder 候選值 有ClasRowMajow 和ClasColMajow 這兩個引數決定一維陣列怎樣儲存在記憶體中,
一般用ClasRowMajow
引數 transA和transB :表示矩陣A,B是否進行轉置。候選引數 CblasTrans 和CblasNoTrans.
引數M:表示 A或C的行數。如果A轉置,則表示轉置後的行數
引數N:表示 B或C的列數。如果B轉置,則表示轉置後的列數。
引數K:表示 A的列數或B的行數(A的列數=B的行數)。如果A轉置,則表示轉置後的列數。
引數LDA:表示A的列數,與轉置與否無關。
引數LDB:表示B的列數,與轉置與否無關。
引數LDC:始終=N
examp1:
輸出#include <vector> #include <iostream> #include "caffe/util/math_functions.hpp" using namespace std; int main() { const int M=4; const int N=2; const int K=3; const float alpha=1; const float beta=0; const int lda=M; const int ldb=K; const int ldc=N; const float A[K*M]={1,2,3,4,5,6,7,8,9,8,7,6}; const float B[N*K]={5,4,3,2,1,0}; float C[M*N]; cblas_sgemm(CblasRowMajor, CblasTrans, CblasTrans, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); for(int i=0;i<M;i++) { for(int j=0;j<N;j++) { cout<<C[i*N+j]<<" "; } cout<<endl; } 」
52 7
58 10
64 13
70 16
examp2:#include <vector> #include <iostream> #include "caffe/util/math_functions.hpp" using namespace std; int main() { const int M=4; const int N=2; const int K=3; const float alpha=1; const float beta=0; const int lda=K; const int ldb=N; const int ldc=N; const float A[M*K]={1,2,3,4,5,6,7,8,9,8,7,6}; const float B[K*N]={5,4,3,2,1,0}; float C[M*N]; cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc); for(int i=0;i<M;i++) { for(int j=0;j<N;j++) { cout<<C[i*N+j]<<" "; } cout<<endl; } }
結果:
14 8
41 26
68 44
67 46