1. 程式人生 > >Windows下MSYS2中編譯OpenBLAS過程記錄

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