1. 程式人生 > >cblas_sgemm 原始碼講解

cblas_sgemm 原始碼講解

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