Windows版RでOpenBLASをリンクする
Rのベクトル計算、線形代数演算を速くしたい場合はOpenBLASをリンクするのが有効な手段なので、Windows版での利用方法を紹介します。
ループでスカラ演算を繰り返すよりもベクトル演算をした方が速いRですが、標準構成ではNetlib BLASと言う線形代数ライブラリBLASのリファレンス実装を使っていて、行列演算、ベクトル演算も速いとは言えないものとなっています。
解決方法はあって、チューニングされたOpenBLASに差し替えることで高速化が可能です。
UNIX/UNIX Clone環境では、リンクするDLLをOpenBLASに変更するだけで高速化ができることが多いです。Ubuntu Linuxでは
sudo apt install libopenblas0-pthread
とすれば、OpenBLASがインストールされ、aptでインストールしたRはOpenBLASを使うようになります。簡単ですね。
しかし、Windowsだと時間のかかる煩雑な作業が必要です。Windows版R 4.2における手順をまとめておきます。なお、ちょっとだけチートペーパーと手順を変えました。
1 補助ツールのインストール
Windows版のRの場合は、R全体のコンパイルからやり直す必要があります。現在ではコンパイル方法はまとめられていて専門的な知識なくできるのですが、コンパイルに補助ツールが必要になったりと、手間暇はかかります。
1.1 Inno Setupのインストール
公式サイトからインストーラーinnosetup-6.2.1.exe
をダウンロードしてきて、Inno
Setupをインストール1。インストール先はデフォルトで2。
1.2 MikTeXのインストール
MikTeXのダウンロードとインストール、アップデートとアップデートにあわせた設定の更新をします。
- 公式サイトから
basic-miktex-22.3-x64.exe
をダウンロードしてきて、MikTeXをインストール - 付属ユーティリティMiKTeX Consoleで、
- administration modeを選択し、Check for updates、Update nowを実行
- メニューのTasksのRefresh file name database、Refresh font map files、Update package databaseを順番に実行
なお、LaTeXが入っている環境でRをコンパイルしないときは、システム環境変数PATH
からMikTeXは外しておいたほうがよいです。
1.3 QPDFのインストール
SourceForgeのQPDFのリポジトリからバイナリqpdf-10.6.3-bin-mingw32.zip
をダウンロードしてきて、C:
で展開。
2 Rtools42のインストール
Rの公式サイトのRtools42のフォルダーからRtools42
installer(rtools42-5253-5107.exe
)をダウンロードしてきてインストールします。
続いて、Rtools42 Bash
を起動して、wget
コマンドを追加して、Rtoolsのアップデートをします。
pacman -Sy wget
pacman -Syuu
アップデート後、自動終了します。
3 R 4.2のコンパイル
Rtools42
Bashを再び起動して、(一時的に使う)PATH
などを設定します
export PATH=/c/rtools42/x86_64-w64-mingw32.static.posix/bin:/c/rtools42/usr/bin:$PATH
export PATH=/c/Program\ Files/MiKTeX/miktex/bin/x64:$PATH
export TAR="/usr/bin/tar"
export TAR_OPTIONS="--force-local"
Rtools42 Bash
を終了したら、再設定になるので注意してください。
最新ソースコードをダウンロードしてきて、C:
に置きます。
cd /c
wget https://cran.r-project.org/src/base-prerelease/R-latest.tar.gz
tar zxf R-latest.tar.gz --force-local
# 「シンボリックリンクが作れません」とエラーが出た場合は、展開したファイルを残したまま、同じコマンドで展開すると誤魔化せる[^4]
C:\R-patched
が出来ます3。
Rの公式サイトのRtools42のフォルダーにあるTcl/Tkのソースコードをダウンロードしてきて、C:\R-patched
に展開します。
export wdir=/c/R-patched # 展開先がC:\R-patchedでない場合は、ここを修正
cd $wdir
wget https://cran.r-project.org/bin/windows/Rtools/rtools42/files/tcltk-5355-5175.zip
unzip tcltk-5355-5175.zip
なお、ファイル名tcltk-5355-5175.zip
は、今後、変わっていく可能性があるので4、適時変更してください。
そして、src/gnuwin32
に移動して、MkRules.local
をつくります。qpdfのフォルダ名に注意してください。
cd $wdir/src/gnuwin32
cat <<EOF >MkRules.local
USE_ATLAS = YES
EOPTS = -march=native -pipe -mno-rtm -mno-fma
LTO = -flto -ffat-lto-objects -fuse-linker-plugin
LTO_OPT = -flto -ffat-lto-objects -fuse-linker-plugin
LTO_FC_OPT = -flto -ffat-lto-objects -fuse-linker-plugin
QPDF = C:/qpdf-10.6.3
OPENMP = -fopenmp
EOF
QPDFのパスはインストール先にあわせてください。
src/extra/blas/Makefile.win
をsed
で置換します。notepad
で編集したいのですが、UNIX改行コードを認識しないので。
cd $wdir/src/extra/blas
mv Makefile.win Makefile.win.old
sed 's/-L"$(ATLAS_PATH)" -lf77blas -latlas/-fopenmp -lopenblas/' < Makefile.win.old > Makefile.win
Makefile.win
が変わっているとパターンマッチしないので、cat Makefile.win
をして、しっかり書き換わっているかチェックしてください。
PATH
が通っているか確認します。
which make gcc pdflatex tar
エラーが出なければ問題なしです。 コンパイルを開始します。
cd $wdir/src/gnuwin32
make distribution
無事、終わればC:\R-patched\src\gnuwin32\installer
にR-4.2.2patched-win.exe
が出来上がっています。
一度で上手くはいかないことが多いと思います。私はMikTeXのアップデート後の処理が抜けて!pdfTeX error: pdflatex.exe (file ts1-zi4r): Font ts1-zi4r at 540 not found
と言われたり、QPDFのパス指定を誤ったりして、修正後、make distribution
をやり直しました5。
4 動作確認
Windows版ではsessionInfo()
をしても使っているBLASの種類を教えてくれないのですが、マルチコアの計算機で以下のように行列演算をさせて、ユーザー時間が経過時間よりも大きければ並行処理ができているので、OpenBLASとリンクしているのが分かります。
set.seed(1013)
<- 5000
n <- matrix(runif(n^2, min=1, max=10), n, n)
M1 <- matrix(runif(n^2, min=1, max=10), n, n)
M2 system.time({ M3 <- M1 %*% M2 })