Windows MatlabのMexでOpenBlasを使う


研究でC++とcBlasで書いていたコードをMatlab上でMexファイルとして呼び出せるようにする必要があり、

  • OpenBLASのインストール
  • Mexでcblasを呼びだす

についてまとめました。
特にOpenBLASのソースからのビルドはめんどくさかったので忘備録として残しておきます。

ちなみに、MexコンパイラはVisual Studio 2017を使用しています。
OSはWindows 10です。

OpenBLASのインストール

cmakeを使ってOpenBlasをMake & Installします。
cmakeはMiniconda環境でインストール&実行しました。
主に公式のドキュメントに従って行います。

Minicondaをインストール

公式サイトからMinicondaをインストールします。

Anaconda Promptで以下を実行

conda update -n base conda
conda config --add channels conda-forge

Condaで以下をインストール

Fortranコンパイラではflangを使用します。

conda install -y cmake flang clangdev perl libflang git
conda install -y -c isuruf kitware-ninja

バッチファイルを端末上で実行

Visual Studio 2017の場合以下の場所にバッチファイルがあるので、プロンプト上で実行します。

/c/Program\ Files\ \(x86\)/Microsoft\ Visual\Studio/2017/Community/VC/Auxiliary/Build/vcvars64.bat

環境変数を通す

set "LIB=%CONDA_INSTALL_LOCN%\Library\lib;%LIB%"
set "CPATH=%CONDA_INSTALL_LOCN%\Library\include;%CPATH%

公式からOpenBLASをgit clone

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

buildディレクトリを作成

cd OpenBLAS/
mkdir build
cd build/

Cmake

cmake ../ -G "Ninja" ^
    -DCMAKE_C_COMPILER=clang-cl ^
    -DCMAKE_Fortran_COMPILER=flang ^
    -DBUILD_WITHOUT_LAPACK=yes ^
    -DNOFORTRAN=0 -DDYNAMIC_ARCH=OFF ^
    -DCMAKE_INSTALL_PREFIX="C:\tools\OpenBLAS" ^
    -DCMAKE_BUILD_TYPE=Release

Cmake build and install

cmake --build . --config Release --target install

Mexでのコンパイル

以下ようにオプションをつけてコンパイルします。

Mexでのコンパイル

PATH_TO_OPENBLASはOpenBLASをインストールしたディレクトリのトップです。
インクルードライブラリの指定は-IPATH_TO_OPENBLAS\OpenBLAS\include\openblasのように指定しますが-Iとパスの間にスペースは入れないで実行します。

mex -R2018a filename.cpp PATH_TO_OPENBLAS\OpenBLAS\lib\openblas.lib '-IPATH_TO_OPENBLAS\OpenBLAS\include\openblas' COMPFLAGS="/openmp /O2 $COMPFLAGS"  -v

-vはコンパイルの詳細表示です。
またCOMPFLAGS="/openmp /O2 $COMPFLAGS"はVisual Studio CompilerへのコンパイルオプションでOpenMPと最適化オプションO2をつけてコンパイルしています。

実行時について

コンパイル済みMexファイルと同じディレクトリ内に
PATH_TO_OPENBLAS\OpenBLAS\bin\openblas.dll
を配置して実行します。

Matlab2018で作成したMexファイルはMatlab2018以前では実行できないので注意が必要です。

まとめ

以上適当にまとめたので間違いなど多いと思いますが勘弁してください。
もともとのプログラムはUbuntu + clangで実行していましたが、それよりは遅くなってしまいました。SSE命令やAVX命令を使えばもっと早くなるらしいですがやる気が起きない。

参考

・公式ドキュメント
https://github.com/xianyi/OpenBLAS/wiki/How-to-use-OpenBLAS-in-Microsoft-Visual-Studio
・インストールについて
https://www.kunihikokaneko.com/dblab/toolchain/openblas.html
・Ninjaのエラー
https://github.com/xianyi/OpenBLAS/issues/1424