# 编译
在官网上下载 zip 或通过 git 下载:
weget https://github.com/OpenMathLib/OpenBLAS.git |
将文件解压后进入工程主目录
编译 openblas 库
make -j32 |
导出 依赖库
make install PREFIX=/path/to/your/admire |
# cblas_sgemm 函数
cblas_sgemm(order, transA, transB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC); | |
order : ClasRowMajow 行优先 ClasColMajow 列优先 | |
transA : CblasTrans 转置 CblasNoTrans 不转置 | |
transA : CblasTrans 转置 CblasNoTrans 不转置 | |
M : 表示 A或C的行数。如果A转置,则表示转置后的行数 A的行数(transA处理之后) | |
N : 表示 B或C的列数。如果B转置,则表示转置后的列数 B的列数(transB处理之后) | |
K : K = A的列数 = B的行数 | |
ALPHA : ALPHA(A*B)+BETA*C 矩阵权重 | |
A : 输入矩阵A (M*K) | |
LDA : A所在矩阵的列数 有可能 LAD>K | |
B : 输入矩阵B (K*N) | |
LDB : B所在矩阵的列数 有可能 LDB>N | |
BETA : ALPHA(A*B)+BETA*C 偏置权重 | |
C : 偏置C 同时也是输出C (M*N) | |
LDC : C所在矩阵的列数 有可能 LDC>N |
# 使用例子
#include <vector> | |
#include <iostream> | |
#include <cblas.h> | |
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; | |
} | |
} |
对应的 CMakeLists.txt 文件
cmake_minimum_required (VERSION 3.5) | |
project (demo) | |
include_directories (${PROJECT_SOURCE_DIR}/include | |
/path/to/your/admire/include) | |
find_library(OpenBlas_Lib openblas HINTS /path/to/your/admire/lib) | |
AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src SRC_FILE) | |
set (SRC_FILE ${PROJECT_SOURCE_DIR}/src/test.cpp) | |
add_executable (demo ${SRC_FILE}) | |
target_link_libraries (demo ${OpenBlas_Lib} m) |
在工程主目录
mkdir build && cd build | |
cmake .. | |
make | |
./demo |
# 后记
本博客目前以及可预期的将来都不会支持评论功能。各位大侠如若有指教和问题,可以在我的 github 项目 或随便一个项目下提出 issue,或者知乎 私信,并指明哪一篇博客,我看到一定及时回复,感激不尽!