BLAS(基本线性代数子程序)是提供用于执行基本矢量和矩阵运算的标准构建块的例程。1级BLAS执行标量,矢量和矢量运算,2级BLAS执行矩阵矢量运算,3级BLAS执行矩阵运算。由于BLAS高效,便携且广泛可用,因此它们通常用于软件开发中高质量的线性代数运算。CBLAS是BLAS的C语言版本。
BLAS官网:http://www.netlib.org/
CBLAS移植过程如下:
1、从官网下载 blas-3.8.0.tgz 和 cblas.tgz 并解压,分别得到两个目录:BLAS-3.8.0 和 CBLAS
2、编译 blas 和 cblas
进入到 BLAS-3.8.0 目录下,执行如下命令:
注:本人 主机的arm教程编译工具链目录为:/opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf,仅仅是两条命令,没必要设置环境变量,直接采用绝对路径,简单粗暴。
/opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gfortran -c -O3 *f
/opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ar rv libblas.a *.o
此时可以看到当前目录下,已经生成了库文件:libblas.a
把 libblas.a 拷贝到 CBLAS/testing 目录下(必不可少的一步,否则编译CBLAS的testing的时候会报错),并建立针对 ARM 的 Makefile.in 。我的是直接修改的 Makefile.LINUX (已备份),主修改后的文件如下:
#
# Makefile.LINUX
#
#
# If you compile, change the name to Makefile.in.
#
#
#-----------------------------------------------------------------------------
# Shell
#-----------------------------------------------------------------------------
SHELL = /bin/sh
#-----------------------------------------------------------------------------
# Platform
#-----------------------------------------------------------------------------
PLAT = ARM
#-----------------------------------------------------------------------------
# Libraries and includs
#-----------------------------------------------------------------------------
BLLIB = libblas.a
CBLIB = ../lib/cblas_$(PLAT).a
#-----------------------------------------------------------------------------
# Compilers
#-----------------------------------------------------------------------------
CC = arm-linux-gnueabihf-gcc
FC = arm-linux-gnueabihf-gfortran
LOADER = $(FC)
#-----------------------------------------------------------------------------
# Flags for Compilers
#-----------------------------------------------------------------------------
CFLAGS = -O3 -DADD_
FFLAGS = -O3
#-----------------------------------------------------------------------------
# Archive programs and flags
#-----------------------------------------------------------------------------
ARCH = arm-linux-gnueabihf-ar
ARCHFLAGS = r
RANLIB = echo
修改完成 Makefile.in 文件后,执行如命令:
# 删除原有的 Makefile.in 文件
rm Makefile.in
# 建立对应架构的Makefile.in 文件
ln -s Makefile.LINUX Makefile.in
# 设置环境变量,否则找不到交叉编译工具链
export PATH=/opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin:$PATH
#编译源码,静待结束
make
3、应用示例
今天看到有朋友回复的问题,在引用生成的静态库时,出现了编译不过的问题,故而添加以下内容,希望有所帮助。
通过以上方式,编译出cblas_ARM.a和libblas.a后,把两个库文件以及cblas.h(目录: CBLAS/include/cblas.h)拷贝到工程目录下,然后编译输出可执行程序即可。盗用一下回复中的例子:
extern "C"
{
#include "cblas.h"
}
#include
using namespace std;
int main(void) {
const enum CBLAS_ORDER Order=CblasRowMajor;
const enum CBLAS_TRANSPOSE TransA=CblasNoTrans;
const enum CBLAS_TRANSPOSE TransB=CblasNoTrans;
const int M=4;//A的行数,C的行数
const int N=2;//B的列数,C的列数
const int K=3;//A的列数,B的行数
const float alpha=1;
const float beta=0;
const int lda=K;//A的列
const int ldb=N;//B的列
const int ldc=N;//C的列
const float A[K*M]={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(Order, TransA, TransB, M, N, K, alpha, A, lda, B, ldb, beta, C, ldc);
for(int i=0;i
把以上的代码保存成 main.cpp,然后把 cblas_ARM.a、libblas.a、cblas.h拷贝到main.cpp的同级目录下,通过以下命令编译生成可执行程序 main,详见下图:
/opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ main.cpp cblas_ARM.a libblas.a -o main -lgfortran
然后把 main 拷贝到ARM开发板上,直接运行 main 即可,详见下图:
另:
如果在开发板上运行 main 时,提示缺少 库文件 libgfortran.so.4, 可将 /opt/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib/libgfortran.so.4.0.0 拷贝到开发板的 /lib 目录下。