OpenBLAS 介绍
OpenBLAS是由中科院软件所并行软件与计算科学实验室发起的基于GotoBLAS2 1.13 BSD版的开源BLAS库高性能实现.
OpenBLAS源码地址
OpenBLAS地址:https://github.com/xianyi/OpenBLAS/tree/release-0.2.21
build OpenBLAS for iPhone
1.下载源码,下载之后如下图所示:
2.找到c_check文件,在这段代码的后面
$cross_suffix = "";
if (dirname($compiler_name) ne ".") {
$cross_suffix .= dirname($compiler_name) . "/";
}
if (basename($compiler_name) =~ /([^\s]*-)(.*)/) {
$cross_suffix .= $1;
}
添加如下代码:
$cross_suffix = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/";
3.新建一个openBlasBuild.sh文件,写入如下代码:
TOOLCHAIN_PATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
SYSROOT_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk
make TARGET=ARMV8 BINARY=64 HOSTCC=clang CC="$TOOLCHAIN_PATH/clang -isysroot $SYSROOT_PATH -arch arm64 -miphoneos-version-min=8.0 -O2" NOFORTRAN=1 libs
参数说明TOOLCHAIN_PATH xcode安装目录,SYSROOT_PATH iOS SDK目录,make编译,TARGET目标架构(可以是ARMV8,x86_64等),-arch arm64可以是arm64、armv7、arm7s。
4.把openBlasBuild.sh执行文件放到刚刚下载的OpenBLAS源码根目录下,如下图所示:
赋予openBlasBuild.sh文件可执行权限:
chmod a+x openBlasBuild.sh
然后运行:
./openBlasBuild.sh
等待编译完成,在OpenBLAS源码根目录下就生成了libopenblas_armv8p-r0.2.20.a文件。
如何使用
刚刚生成的是一个libopenblas_armv8p-r0.2.20.a静态库,需要的头文件如下图所示:(在OpenBLAS源码目录下都可以找得到这些头文件)
把这个文件夹加入到iOS工程引头文件就可以使用了,注意需要把用到的那个类的后缀名改为.mm,这样xcode才可以编译通过,因为这个库是c++写的。
编译支持模拟器x86_64
需要支持模拟器的把步骤3的代码改为:
TOOLCHAIN_PATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
SYSROOT_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
make TARGET=x86_64 BINARY=64 HOSTCC=clang CC="$TOOLCHAIN_PATH/clang -isysroot $SYSROOT_PATH -arch x86_64 -miphoneos-version-min=8.0 -O2" NOFORTRAN=1 libs
新下载一份OpenBLAS源码,按照234步骤编译。通过lipo -create -output命令把两个.a合在一块就可以同时支持模拟器与真机了(iPhone5s以上机型与模拟器)。
两个.a文件合并完成了,还需要合并用到的头文件中的config.h文件,每次生成.a文件都会生成对应的config.h文件。config.h里面是定义的宏,我们用#if !TARGET_IPHONE_SIMULATOR预编译宏区别是真机还是模拟器。把两个config.h文件的内容合并为一个如下图所示: