CBLAS 的安装与使用
ysm
cleverysm@ gmail .com
CBLAS 是 BLAS 的 C 语言接口。BLAS 的全称是 Basic Linear Algebra Subprograms,中文大概可以叫
做基础线性代数子程序。主要是用于向量和矩阵计算的高性能数学库。本身 BLAS 是用 Fortran 写的,为
了方便 C/C++程序的使用,就有了 BLAS 的 C 接口库 CBLAS。BLAS 的主页是 http://www.netlib.org/
blas/,CBLAS 的下载地址也可以在这个页面上找到。
CBLAS 安装需要先装 BLAS,从主页上下载 blas.tgz,解压,根据系统修改 make.inc 和
Makefile,make,就会生成一个 blas_LINUX.a 文件。然后,下载 cblas.tgz,解压,在目录下将 Makefile.*
文件改名或者做一个链接文件为 Makefile.in 文件,比如在 linux 下就是 ln -s Makefile.LINUX Makefile.in,
根据具体情况修改 Makefile.in 文件,主要是 BLAS 的库文件路径 BLLIB 和 CBLAS 的安装目录
CBDIR,make help 就可以打印出可以使用的 make 命令,要生成全部文件就是用 make all。在$(CBDIR)目
录下的$(CBLIBDIR)将生成 CBLAS 的库文件$(CBLIB),cblas_LINUX.a。
在 CBLAS 的安装目录$(CBDIR)下的 src 目录中有个 cblas.h 是包括的 CBLAS 的函数和常量的头文件,
使用 CBLAS 的时候就需要这个头文件,同时还需要 BLAS 的库文件$(BLLIB )和 CBLAS 的库文件$
(CBLIB)。
CBLAS/BLAS 分为 3 个 level,level1 是用于向量的计算,level2 是用于向量和矩阵之间的计算,
level3 是矩阵之间的计算。比如计算矩阵的乘法就是属于 level3,这里就用矩阵乘法来学习使用 CBLAS。
计算矩阵乘法的函数之一是 cblas_sgemm,使用单精度实数,另外还有对应双精度实数,单精度复数
和双精度复数的函数。在此以 cblas_sgemm 为例。
函数定义为:
void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
const int K, const float alpha, const float *A,
const int lda, const float *B, const int ldb,
const float beta, float *C, const int ldc)
关于此函数的详细定义可以在 http://www.netlib.org/blas/sgemm.f 找到,只不过是 fortran 语言的,这个 C
语言版的略有差别。
此函数计算的是 C = alpha*op( A )*op( B ) + beta*C,
const enum CBLAS_ORDER Order,这是指的数据的存储形式,在 CBLAS 的函数中无论一维还是二
维数据都是用一维数组存储,这就要涉及是行主序还是列主序,在 C 语言中数组是用行主序,fortran 中
是列主序。我还是习惯于是用行主序,所以这个参数是用 CblasRowMajor,如果是列主序的话就是
CblasColMajor。
const enum CBLAS_TRANSPOSE TransA 和 const enum CBLAS_TRANSPOSE TransB,这两个参
数影响的是 op( A )和 op( B),可选参数为 CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113,其中
TransA = CblasNoTrans, op( A ) = A,TransA = CblasTrans, op( A ) = A',TransA = CblasConjTrans, op( A ) =
A'。 TransB 类似。
const int M,矩阵 A 的行,矩阵 C 的行
const int N,矩阵 B 的列,矩阵 C 的列
const int K,矩阵 A 的列,矩阵 B 的行