Windows下MSYS2中編譯OpenBLAS過程記錄
OpenBLAS(https://github.com/xianyi/OpenBLAS)目前已經提供了CMakeLists.txt,在Windows下可以通過cmake生成Makefile指令碼,然後用MinGW或GCC編譯。
但是,CMakeLists.txt中已經有警告申明,cmake支援還在實驗中,並不會生成與OpenBLAS自帶的Makefiles相同的內容,而且只支援32位編譯,而且目前版本的CMakeLists.txt並沒有提供install功能(而這也是我需要的)。
message(WARNING “CMake support is experimental. This will not produce the same Makefiles that OpenBLAS ships with. Only x86 support is currently available.”)
https://github.com/xianyi/OpenBLAS/blob/develop/CMakeLists.txt
這諸多限制,帶來問題就是用在windows下用cmake編譯OpenBLAS並不方便,也不完全滿足工程化要求。
好在OpenBLAS官網上提供了關於在windwos下編譯的說明檔案《How to use OpenBLAS in Microsoft Visual Studio》,看了這篇文章我搞明白了,在Windows下編譯OpenBLAS正確的開啟方式是在MSYS2下用MinGW編譯。
MSYS2是什麼?
Minimal GNU(POSIX)system on Windows,是MinGW提供的一個小型的GNU環境,包括基本的bash,make等等。與Cygwin大致相當。
簡單說MSYS就相當於一個在Windows下執行的linux bash shell環境,支援絕大部分linux常用命令,說得更明白點,就是linux下的sh指令碼可以在這個環境下執行,linux下的Makfile也可以在這個環境下用MinGW編譯
而MSYS2 是一個獨立專案,它重寫了MSYS, MSYS2安裝更簡單,使用更方便,還提供pacman工具進行軟體包的安裝管理(就像ubuntu 的apt-get,centos 的 yum),
所以有了MSYS2的幫助再加上MinGW,我們可以直接在Windows下make 編譯OpenBLAS的Makefile,而不需要用cmake
MSYS2安裝
安裝MSYS2很簡單,去這裡下載.tar.xz或.exe http://repo.msys2.org/distrib/
.tar.xz檔案解壓出來就可以了,當然你也可以下載.exe檔案執行安裝(這要寫Windows登錄檔)
我選擇直接解壓.tar.xz檔案來安裝
安裝MinGW編譯器
MSYS2本身的pacman可以提供軟體安裝功能(參見上面MSYS2的官網上的示例),通過pacman就可以安裝mingw-w64提供的mingw編譯器。
# 安裝 mingw64 64位編譯器
$ pacman -S mingw-w64-x86_64-gcc
# 安裝 mingw32 32位編譯器
$ pacman -S mingw-w64-i686-gcc
下載的mingw編譯器壓縮包,解壓到本地資料夾就算是安裝好了。
編譯OpenBLAS
首先進入 MSYS2 shell
如下在MSYS2的usr\bin檔案下執行 bash -l,就進入了
d:\msys64\usr\bin>bash -l
安裝perl
OpenBLAS Makefile指令碼中有用到perl,所以在make之前要先安裝perl
$ pacman -S --noconfirm perl
編譯 OpenBLAS
以下是MSYS2中執行編譯OpenBLAS的shell指令碼
#!/bin/bash
# 將自己的MinGW編譯器加入搜尋路徑
export PATH=/D/tools/mingw64/bin:$PATH ;
# 切換到 OpenBLAS 原始碼資料夾
cd "/D/source/OpenBLAS-0.2.18" ;
# 先執行make clean
echo start make clean,please waiting...;
# 清除之前編譯生成的中間檔案
mingw32-make clean ;
# 出錯就中止編譯
if [ ! $? ];then exit -1;fi;
# -j 選項用於指定多執行緒編譯
# 編譯OpenBLAS很耗時,多執行緒編譯才能提高編譯速度
# 如果你的MinGW編譯器有make.exe,這裡mingw32-make也可以替換為make
mingw32-make -j 8 NOFORTRAN=1 \
BINARY=64 \
DEBUG=0 \
DYNAMIC_ARCH=1
USE_THREAD=1 \
NUM_THREADS=24;
if [ ! $? ];then exit -1;fi;
# 刪除安裝路徑
rm "/D/release/OpenBLAS_windows_gcc540_x86_64" -fr;
#if [ ! $? ];then exit -1;fi;
# 安裝到指定的位置 /D/release/OpenBLAS_windows_gcc540_x86_64
mingw32-make install PREFIX="/D/release/OpenBLAS_windows_gcc540_x86_64" NO_LAPACKE=1
OpenBLAS編譯引數簡介
BINARY=64
用於指定編譯32位還是64位程式碼
DYNAMIC_ARCH=1
指定使用動態核心模式(DYNAMIC_ARCH),
DYNAMIC_ARCH是指OpenBLAS 庫中同時包含支援多種 cpu 核心架構的程式碼,
OpenBLAS可以在執行時自動切換到合適的架構程式碼(編譯耗時較長)
如果不指定此引數則會自動檢測當前 cpu ,編譯出適合當前 cpu 架構的OpenBLAS庫(編譯時間較短),
在其他不同架構的cpu上執行可能會存在指令集相容性問題
USE_THREAD=1
指定使用多執行緒,OpenBLAS預設就是使用多執行緒模式,所以這個引數可以去掉
NUM_THREADS=24
多執行緒模式時最大執行緒數,如果不指定則定義為當前cpu的核心數
關於 OpenBLAS 的引數更詳細的說明參見 OpenBLAS 原始碼資料夾下的 GotoBLAS_02QuickInstall.txt,Makefile.rule,USAGE.md等檔案,以及 OpenBLAS官網的說明(https://github.com/xianyi/OpenBLAS)
Visual Studio 中匯入OpenBLAS庫
根據OpenBLAS官網的說明,MSVC下只能使用OpenBLAS動態庫,MinGW則動態庫和靜態庫都可以使用。
MSVC下匯入動態庫就是將libopenblas.dll.a加入連線庫的清單,這裡.dll.a等同於動態庫匯入庫(import library).lib
Limitations
Both static and dynamic linking are supported with MinGW. With Visual Studio, however, only dynamic linking is supported and so you should use the import library.
@ https://github.com/xianyi/OpenBLAS/wiki/How-to-use-OpenBLAS-in-Microsoft-Visual-Studio