Openblas windows编译小记

 

          近期使用Caffe做深度学习相关的项目,项目限制只能使用CPU做识别,为了提高识别速度,除了优化模型,就是优化Openblas,因为Caffe主要的计算都是交给Openblas做的。

          Caffe默认下载的是 0.2.14.1 版本,这个版本是针对NEHALEM 内核的CPU,对MMX 、SSE指令集做了优化,目前的CPU是Broadwell的,已经支持了AVX,FMA指令集,理论上比SSE更快。因此很自然的想法就是寻找支持AVX指令集的Openblas, 不过经过寻找,发现SourceForge上的Windows Binary版本都是比较老的,只支持到SSE指令集,因此就打算编译最新版的来支持AVX。

          由于第一次搞windows编译开源项目,很是花了一番功夫,搜索了很多相关的方法介绍。有的用Cygwin的,由于用Cmake+VisualStudio的,由于用MSYS+MinGW的,五花八门...... 因为项目是用VS开发的,先尝试了CMake+VisualStudio的方法,为此还专门安装了一个针对Windows的CMake制作程序,但是下一步就出错了,cmake编译不通过,找了很多方法都不奏效。

          还好Openblas github官网有介绍如何在Window上编译的方法(How to use OpenBLAS in Microsoft Visual Studio),于是照葫芦画瓢,开始操作....

          不过Native (MSVC) ABI遇到问题:安装了Anaconda3,VS2015,执行到cmake 这一行代码的时候,报错,搜相关关键字,搜不到,于是试下一个方法。(没搞过没有办法深入分析)     

cmake .. -G "Ninja" -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_C_COMPILER=clang-cl -DCMAKE_Fortran_COMPILER=flang -DBUILD_WITHOUT_LAPACK=no -DNOFORTRAN=0 -DDYNAMIC_ARCH=ON -DCMAKE_BUILD_TYPE=Release

           GNU (MinGW) ABI方法OK,此方法是用MSYS2+MinGW_W64工具组合进行,查了之后知道MSYS2是一个模拟linux的命令行,MinGW是linux编译器的windows移植版本。算是比较正宗的linux血统了。

           当时下载的默认的Openblas develop分支,然后查找相关指令后,编译,我的CPU是Broadwell,最接近的是Haswell,如果用skylake,因为指令集(skylake支持AVX512)不同,编译出来的不能用(程序运行会卡主), 而困扰心中已久的疑问AVX指令集支持与否,也经过搜查资料得以解开: 指定目标架构时,makefile已经相应配置了对应的AVX指令集的支持,不需要额外增加编译指令。

            具体操作见本博文,很有帮助。

            https://cloud.tencent.com/developer/article/1011945

            github官方操作说明:

            https://github.com/xianyi/OpenBLAS/wiki/How-to-use-OpenBLAS-in-Microsoft-Visual-Studio

            编译通过,很开心,版本是0.3.4, 跟旧版的0.2.14.1比起来,从20fps提升到23fps,性能提升15%,  提升有限,不过基于CPU的方案也只能如此了。

            我用的编译指令 :make -j 8 TARGET=HASWELL BINARY=64 DEBUG=0 NOFORTRAN=1 USE_THREAD=1

经过测试开启OpenMP,指定线程数量(因为外层程序使用了OpenMP)最后发现,让OpenBlas自己管理线程,性能最高,OpenMP开启与否没差别。

            还有一个分支是Optimized for deeplearning,下载下来编译,看看是否速度更快,不过遇到了官网提示的bug,

<command-line>:0:4: error: expected identifier or '(' before numeric constant

             于是看说明,还好这个问题已经解决了,说是新版本的gcc会遇到,换成低版本的就没问题了(莫名其妙,后来搜索发现可能是某些宏命令的定义格式支持不一样,导致编译出错),按照提示从 http://repo.msys2.org下载下面三个包,

mingw-w64-x86_64-crt-git-6.0.0.5100.739199f8-1-any.pkg.tar.xz
mingw-w64-x86_64-headers-git-6.0.0.5102.2f16a8c7-1-any.pkg.tar.xz
mingw-w64-x86_64-tools-git-6.0.0.5079.3b7a42fd-1-any.pkg.tar.xz

  在使用pacman -U指令到路径下安装按个包,完成了git工具的降级,之前是7.x版本,现在降成了6.0, 再编译,果然不再报错了。

              期间试了网页上说的另一个方法:从SourceForge上下载MinGW不报错,MSYS2 的pacman下载的默认MinGW会报错,

于是从SourceForge上下载了最新的8.X版本,下载的只是一个下载器,还要下载1个多小时才能完成, 经过尝试,这个方法不行,仍然会报这个错误。

              经过测试,optimized这个版本速度比develop版本的稍慢,与master版本基本相同,最快的是develop版本,经过测试,develop版本也是准确的。

 

              这是第二次摸索在Windows下编译linux开源(第一次是用Cmake方案没成功),真是一波三折,好在最终试通了。写下来,供后来者参考吧。

www.intelvisioncn.com

 

         

             

          

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值