嵌入式平臺OpenBlas及Clapack的交叉編譯

該博文屬於系列文章,其他文章參考總覽: kaldi嵌入式平臺的移植及實現

 

前言:

OpenBlas是一款開源的矩陣運算庫,具體介紹參考http://www.openblas.net/ 。在linux PC上,即訓練時,採用的數學矩陣庫爲atlas,此數學庫未開源,在linux中只提供lib庫,所以在嵌入式平臺中,我們需要編譯openblas生成對應的數學矩陣庫。

除OpenBlas外,kaldi還需要線性代數的庫,即Clapack。

OpenBlas下載:

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

OpenBlas編譯:

1. 首先查看TargetList.txt,選擇你要編譯的平臺架構,我使用的mips是一款國產芯片,在TargetList.txt中沒有該選項,選擇一個接近的P5600

2. 修改 Makefile.system 文件

ifeq ($(CORE), P5600)
#CCOMMON_OPT += -mips32r5 -mnan=2008 -mtune=p5600  $(MSA_FLAGS)
#FCOMMON_OPT += -mips32r5 -mnan=2008 -mtune=p5600  $(MSA_FLAGS)
CCOMMON_OPT += -mips32r2 -mtune=mips32r2 -mhard-float $(MSA_FLAGS)
FCOMMON_OPT += -mips32r2 -mtune=mips32r2 -mhard-float $(MSA_FLAGS)
endif

3. 修改 Makefile.prebuild 文件

ifeq ($(TARGET), P5600)
#TARGET_FLAGS = -mips32r5
TARGET_FLAGS = -mips32r2
endif

4. 執行命令 :  make BINARY=32 BINARY32=1 CC=mips-linux-gnu-gcc FC="mips-linux-gnu-gfortran -EL" RANLIB=mips-linux-gnu-ranlib AR=mips-linux-gnu-ar HOSTCC=gcc CFLAGS="-EL" FFLAGS=$CFLAGS LDFLAGS=$CFLAGS TARGET=P5600 ONLY_CBLAS=1 USE_THREAD=0

下圖證明編譯成功

5. make PREFIX=./install/ install

以上,openblas編譯完成,生成的庫在目錄: OpenBLAS/install/ 

-------------------------------------------------------------------------------------------------------------------------------------------------------

下面介紹Clapack相關的編譯方法

Clapack下載:

Clapack官方下載地址 http://www.netlib.org/clapack/, 本博客下載的是clapack-3.1.1.1.tgz版本。參考android平臺的編譯方法: http://jcsilva.github.io/2017/03/18/compile-kaldi-android/ 說明,需要libf2c.a, liblapack.a, libclapack.a and libblas.a這四個庫,其中liblapack.a, libclapack.a這兩個庫是同一個,名字不一樣而已。

Clapack編譯:

1. 解壓 clapack-3.1.1.1.tgz, tar xvf clapack-3.1.1.1.tgz

2. 進入源碼目錄, cd CLAPACK-3.1.1.1/

3. sudo apt-get install gfortran (是否必須未驗證,是compile-kaldi-android中的一步)

4. cp make.inc.example make.inc ,因爲clapack的所有Makefile都是調用make.inc來配置編譯環境

5. 修改make.inc以下選項:

    CC = mips-linux-gnu-gcc
    LOADER    = mips-linux-gnu-gcc
    ARCH     = mips-linux-gnu-ar
    RANLIB   = mips-linux-gnu-gcc-ranlib
    BLASLIB      = ../../libblas.a
    LAPACKLIB    = libclapack.a

6. libblas.a的生成, cd BLAS/SRC/, 執行make

    出現mips-linux-gnu-gcc-ranlib ../../libblas.a 代表編譯成功,此時在CLAPACK-3.1.1.1目錄下,可以看到生成的libblas.a

7. liblapack.a, libclapack.a的生成,cd SRC/ 執行make

    出現mips-linux-gnu-ranlib ../libclapack.a 代表編譯成功,此時在CLAPACK-3.1.1.1目錄下,可以看到生成的libclapack.a 

   cp libclapack.a liblapack.a

8. libf2c.a的生成, cd F2CLIBS/libf2c/

  • vim Makefile, 註釋下面兩行同時修改ar和-ranlib
#       ld -r -x -o $*.xxx $*.o
#       mv $*.xxx $*.o

libf2c.a: $(OFILES)
#        ar r libf2c.a $?
#        -ranlib libf2c.a
        mips-linux-gnu-ar r libf2c.a $?
        -mips-linux-gnu-ranlib libf2c.a
  •    以下編譯錯誤修正, 註釋掉下面兩行

    arith.h: arithchk.c
        $(CC) $(CFLAGS) -DNO_FPINIT arithchk.c -lm ||\
         $(CC) -DNO_LONG_LONG $(CFLAGS) -DNO_FPINIT arithchk.c -lm
        #./a.out >arith.h
        #rm -f a.out arithchk.o

arithchk.c:169:1: warning: return type defaults to 'int' [-Wimplicit-int]
 main()
 ^
./a.out >arith.h
/bin/sh: ./a.out: cannot execute binary file: 可執行文件格式錯誤
Makefile:184: recipe for target 'arith.h' failed
make: *** [arith.h] Error 126
  • Makefle中刪除所有關於uninit,比如uninit.o uninit.c等等,否則會報以下編譯錯誤:
mips-linux-gnu-gcc -c -DNON_UNIX_STDIO -O3 uninit.c
uninit.c:3:19: fatal error: arith.h: No such file or directory
compilation terminated.
Makefile:21: recipe for target 'uninit.o' failed
make: *** [uninit.o] Error 1

以上修改完成後,保存Makefile,執行make操作,如果出現下面幾行提示,則代表libf2c.a生成成功。

mips-linux-gnu-ar: creating libf2c.a
mips-linux-gnu-ranlib libf2c.a
mv libf2c.a ..
 

至此,kaldi所需數學庫mips平臺交叉編譯完成,如果有編譯問題,歡迎留言,一起研究解決方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章