编译aarch64版本的openBlas

本人在编译aarch64版本的 CLblast的时候需要依赖一版aarch64版本的blas库,所以就尝试用openblas。在编译的过程中踩了不少坑,遇到了不少麻烦,这里记录下成功的过程步骤,供大家参考。

1、安装交叉编译工具链

apt-get install gcc-aarch64-linux-gnu -y

apt-get install g++-aarch64-linux-gnu -y

apt-get install gfortran-aarch64-linux-gnu -y

安装完成后,可以通过下面两个命令查看版本,以验证是否安装成功:

aarch64-linux-gnu-gcc -v

aarch64-linux-gnu-gfortran -v

2、下载openblas源代码

源代码的地址是:https://github.com/xianyi/OpenBLAS/

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

这里默认下载的是develop分支的代码,如果想要下载release版本的 ,可以通过tag进行切换

3、编译openblas源码

cd OpenBLAS;

如果是编译x86_64版本的,就比较简单,执行:make FC=gfortran 即可

如果是编译aarch64版本,执行命令:make TARGET=ARMV8 HOSTCC=gcc BINARY=64 CC=aarch64-linux-gnu-gcc FC=aarch64-linux-gnu-gfortran

TARGET参数就是用来设置编译版本的。在OpenBLAS目录下有个TargetList.txt文档,里面写了支持的编译对象。

vi TargetList.txt

如果没有什么问题,编译成功会有以下截图类似的打印日志:

 4、安装

可以通过命令make PREFIX=/path/to/your/installation install,将编译的结果安装到固定目录.会生成下面3个目录:

 

5、遇到的问题

因为我最终的目的是编译CLBlast,需要依赖libopenblas.so*,在链接到这个so的时候,会报说openblas依赖的libgfortran.so.5有未定义符号,例如:

/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libgfortran.so.5: undefined reference to `fstat@GLIBC_2.33'
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libopenblas.so: undefined reference to `pthread_join@GLIBC_2.34'
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libgfortran.so.5: undefined reference to `lstat@GLIBC_2.33'
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libgfortran.so.5: undefined reference to `stat@GLIBC_2.33'
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libopenblas.so: undefined reference to `pthread_setaffinity_np@GLIBC_2.34'
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: /lib/aarch64-linux-gnu/libopenblas.so: undefined reference to `pthread_create@GLIBC_2.34'

 造成这个问题的原因在于:我在最开始编译openblas的时候使用的交叉编译工具链并不是apt安装的,而是下载的tar包解压后配置环境变量后使用的。但是后面在编译CLBLAST的时候,我在编译脚本中又写了apt install gcc-aarch64-linux-gnu  g++-aarch64-linux-gnu  -y ,这就导致前后使用的交叉编译工具链不一致。但是奇怪的是我后来有尝试将apt安装的都卸载,只使用tar包的那一版,却依旧是有问题的。后来我删除了tar包的PATH和LD_LIBRARY_PATH环境变量,只使用apt安装的交叉工具编译链,重新编译了openblas之后再重新编译CLBlast的代码就ok了。

 

以上内容如有不对之处,烦请大家多多指教。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值