K230 OpenBLAS开发指南#

1.OpenBLAS简介#

OpenBLAS 是一个基于BSD许可(开源)发行的优化BLAS计算库。BLAS(Basic Linear Algebra Subprograms,基础线性代数程序集)是一个应用程序接口(API)标准,用以规范发布基础线性代数操作的数值库(如矢量或矩阵乘法),OpenBLAS是BLAS标准的一种具体实现。 在SDK中,已包含预先交叉编译好的OpenBLAS库(位于k230_sdk/src/big/utils/lib/openblas/路径下),用户直接使用该静态库编译自己的可执行程序即可。

2.测试用例编译#

注意:

本节讲解如何通过SDK中预设的OpenBLAS静态库,来进行可执行程序的编译。SDK中已包含多个基于OpenBLAS实现的可执行程序编译示例(位于k230_sdk/src/big/utils/examples/openblas/路径下),本节基于这些示例来进行讲解。

k230_sdk/src/big/utils/examples/openblas/路径下的目录结构说明如下:

|-- 1_openblas_level1             # OpenBLAS示例1
|   |-- CMakeLists.txt            # OpenBLAS示例1的CMake配置文件
|   `-- openblas_level1.cpp
|-- 2_openblas_level2
|   |-- CMakeLists.txt
|   `-- openblas_level2.cpp
|-- 3_openblas_level3
|   |-- CMakeLists.txt
|   `-- openblas_level3.cpp
|-- 4_fortran_example
|   |-- CMakeLists.txt
|   `-- openblas_fortran.cpp
|-- CMakeLists.txt               # 总体CMake配置文件
|-- build_app.sh                 # 总体编译脚本
|-- cmake                        # 默认CMaek配置
|   |-- Riscv64.cmake
|   `-- link.lds

首先,在k230_sdk/src/big/utils/examples/openblas/路径下,运行build_app.sh文件:

./build_app.sh

在终端中出现如下提示,说明可执行程序编译成功:

Install the project...
-- Install configuration: "Release"
-- Installing: /data/zhanglimin/code_kmodel_export_build_inference_k230/k230_sdk/src/big/utils/examples/openblas/out/bin/1_openblas_level1.elf
-- Installing: /data/zhanglimin/code_kmodel_export_build_inference_k230/k230_sdk/src/big/utils/examples/openblas/out/bin/2_openblas_level2.elf
-- Installing: /data/zhanglimin/code_kmodel_export_build_inference_k230/k230_sdk/src/big/utils/examples/openblas/out/bin/3_openblas_level3.elf
-- Installing: /data/zhanglimin/code_kmodel_export_build_inference_k230/k230_sdk/src/big/utils/examples/openblas/out/bin/4_openblas_fortran.elf

最后,在k230_sdk/src/big/utils/examples/openblas/out/bin文件夹中即包含了编译好的所有elf文件:

  • 1_openblas_level1.elf

  • 2_openblas_level2.elf

  • 3_openblas_level3.elf

  • 4_openblas_fortran.elf

3.测试用例运行演示#

3.1 level_1测试用例#

运行方式及输出结果示例如下:

msh /sharefs/bin_openblas>./1_openblas_level1.elf
*********************************************************
This is the result:
4 7 11 14
*********************************************************
This is the reference:
4 7 11 14
{Test PASS}.

3.2 level_2测试用例#

运行方式及输出结果示例如下:

msh /sharefs/bin_openblas>./2_openblas_level2.elf
*********************************************************
This is the result:
20 40 10 20 30 60
*********************************************************
This is the reference:
20 40 10 20 30 60
{Test PASS}.

3.3 level_3测试用例#

运行方式及输出结果示例如下:

msh /sharefs/bin_openblas>./3_openblas_level3.elf
*********************************************************
This is the result:
7 10 15 22
*********************************************************
This is the reference:
7 10 15 22
{Test PASS}.

3.4 Fortran接口测试用例#

运行方式及输出结果示例如下:

msh /sharefs/bin_openblas>./4_openblas_fortran.elf
m=2,n=3,k=4,alpha=1.200000,beta=0.001000,sizeofc=6
This is matrix A

1.000000 2.000000 3.000000 1.000000 2.000000 3.000000 1.000000 2.000000
This is matrix B

1.000000 2.000000 3.000000 1.000000 2.000000 3.000000 1.000000 2.000000 3.000000 1.000000 2.000000 3.000000
*********************************************************
This is the result:
16.801 18.002 18.003 16.801 15.602 22.803
*********************************************************
This is the reference:
16.801 18.002 18.003 16.801 15.602 22.803
{Test PASS}.

4.OpenBLAS交叉编译#

注意:

尽管SDK中已包含预先交叉编译好的OpenBLAS库(位于k230_sdk/src/big/utils/lib/openblas/路径下),感兴趣的用户也可以自己对OpenBLAS进行交叉编译,得到适配K230的OpenBLAS静态库。

4.1 OpenBLAS编译环境搭建#

4.1.1 Git代码下载#

首先使用git获取OpenBLAS仓库,由于OpenBLAS来自于Github,因此克隆速度慢为正常现象,请耐心等待:

git clone https://github.com/xianyi/OpenBLAS.git

OpenBLAS中存在着很多版本,由于 0.3.21 版本与最新分支相比缺少部分特性,这里我们选用当前最新 提交:

git checkout e9a911fb9f011c886077e68eab81c48817cdb782

4.1.2 patch补丁包应用#

注意:

patch补丁包在SDK中的路径为k230_sdk/src/big/rt-smart/userapps/openblas/

首先,在OpenBLAS根目录下,新建patch目录,并将patch补丁包拷贝至patch目录下,放置好的文件夹目录结构示例如下所示:

├── appveyor.yml
├── azure-pipelines.yml
├── BACKERS.md
├── benchmark
├── cblas.h
...
├── common_lapack.h
├── common_level1.h
├── common_level2.h
├── common_level3.h
├── common_linux.h
├── common_loongarch64.h
├── common_macro.h
|-- patch # OpenBLAS 的 补 丁 包
| |-- 0001-****.patch
| |-- 0002-****.patch
| |-- 0003-****.patch
...
| |-- 0009-****.patch
| |-- 0010-****.patch
| |-- 0011-****.patch
...
...
...
├── utest
└── version.h

在OpenBLAS根目录执行以下命令,应用补丁:

git am ./patch/*.patch

4.3 OpenBLAS编译#

进入 OpenBLAS 的根目录,执行以下命令,进行编译:

# 注意:工具链路径会随开发者具体环境不同,路径前缀会有所不同,仅供参考。
make TARGET=C908V HOSTCC=gcc BINARY=64 FC=k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/riscv64-unknown-linux-musl-gfortran CC=k230_sdk/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/riscv64-unknownlinux-musl-gcc NOFORTRAN=0 USE_THREAD=0 LIBPREFIX="./libopenblas" LAPACKE="NO_LAPACKE=0" INTERFACE64=0 NO_STATIC=0 NO_SHARED=1 -Wimplicit-functiondeclaration

编译完成后,将编译好的库安装到指定文件夹中,本示例安装到./install文件夹中:

# 注意:可以按照自己的需求, 修改相应的安装路径。
make PREFIX=./install NO_STATIC=0 NO_SHARED=1 install