cblas
cblas是一个C语言的接口,更方便用C来调用,而不用与fortran混合编程。因此,输入的变量不必是指针,函数名不用加上下划线,等等。下载的地址就在blas的地址blas上。
cblas只是对blas再封装了一下。底层的代码还是用fortran写的blas。这也意味着要想使用cblas,必须在链接库时把走进blas/lapack(2)中的生成的libreblas.a同时链接进去。这样一来,显得有点多此一举,所以我个人觉得没有使用cblas的必要。当然,这一点是在我安装完之后才了解到的,反正都安装了,就把教程写一下,可能以后用得上。
安装
我在官网上下载的是cblas.tgz,没有版本号。细想一下也确实没必要,只是一个外壳而已,不影响使用。
$ tar -xzvf cblas.tgz
进入cblas目录中,发现有一个makefile文件,一个makefile.in和许多makefile.*文件,星号代表的是不同的系统。我个人选择的makefile.linux文件,把已有的makefile.in文件删除,再把makefile.linux文件改名成makefile.in。再修改makefile.in中的相应内容 ,主要修改两个变量的内容
- BLLIB:blas生成的静态库的路径
- CBLIB:cblas库文件的安装路径及名称,名称可以取为libcblas.a
再打开makefile文件看一看有没有什么其它需要修改的地方。没有的话直接
$ make all
就可以了。
例子
还是以dgemm这个函数作为例子。在cblas中这个函数被封装为
void cblas_dgemm(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 double alpha, const double *A,const int lda, const double *B, const int ldb,const double beta, double *C, const int ldc);
其中
- CBLAS_ORDER:按列存储还是按行存储
- CBLAS_TRANSPOSE:是转置还是不转置,或者是共轭
其它参数与blas中的参数没有太大区别,只是不需要全部都是指针。C的代码cb_dgemm.c为:
#include <stdio.h>
#include "cblas.h"
int main()
{
const int dim=2;
double a[4]={1.0,1.0,1.0,1.0},b[4]={2.0,2.0,2.0,2.0},c[4];
int m=dim,n=dim,k=dim,lda=dim,ldb=dim,ldc=dim;
double al=1.0,be=0.0;
cblas_dgemm(101,111,111,m,n,k,al,a,lda,b,ldb,be,c,ldc);
printf("the matrix c is:%f,%f\n%f,%f\n",c[0],c[1],c[2],c[3]);
return 0;
}
cblas_dgemm()中的101的意思是按行存储,111的意思不转置,其它数字的意思在头文件cblas.h中都说明了,可以自行查看。接下来就是链接的过程了,注意要把blas的静态库链接进来。
gcc -o output -I /$(头文件路径) -L /$(库的路径) -static -lreblas -lcblas
如果生成output可执行文件,说明成功了。
总结
cblas其实也是提供了一个C语言程序接口的规范,实际使用的价值不大,这一套规范适用于ATLAS,而ATLAS是一个完全用C写的程序包,关键部分用的是汇编,接下来要说明的重点。