餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

OpenBLASをリンクしたWindows版R 4.2 PR

標準のNetlib BLASよりも高速な線形代数ライブラリOpenBLASをリンクしたR 4.1.xを使ってきたのですが、今年から4.2系が標準になるようです。古いRを使い続けていると、更新されたパッケージを使うときに警告で出て目障りなので、バージョンアップをしてみました。ちょっとだけチートペーパーと手順を変えたので、記録しておきます。

1. 補助ツールのインストール

1.1. Inno Setupのインストール

公式サイトからインストーラーinnosetup-6.2.1.exeをダウンロードしてきて、Inno Setupをインストール*1。インストール先はデフォルトで*2

1.2. 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を順番に実行。

1.3. QPDFのインストール

SourceForgeのQPDFのリポジトリからバイナリqpdf-10.6.3-bin-mingw32.zipをダウンロードしてきて、C:で展開。

2. Rtools42のインストールから、R 4.2PRのコンパイルまで

Rの公式サイトのRtools42のフォルダーからRtools42 installer(rtools42-5253-5107.exe)をダウンロードしてきてインストールします。
まず、Rtools42 Bashを起動して、wgetコマンドを追加して、Rtoolsのアップデートをします。

pacman -Sy wget
pacman -Syuu

自動終了するので、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:に置きます*3

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-rcが出来ます*5

Rの公式サイトのRtools42のフォルダーにあるTcl/Tkのソースコードをダウンロードしてきて、C:\R-rcに展開します。

export wdir=/c/R-rc # 展開先がC:\R-rcでない場合は、ここを修正
cd $wdir
wget https://cran.r-project.org/bin/windows/Rtools/rtools42/files/tcltk-5253-5175.zip
unzip tcltk-5253-5175.zip

なお、ファイル名tcltk-5253-5175.zipは、今後、変わっていく可能性があるので、適時変更してください。
そして、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-rc\src\gnuwin32\installerにR-4.2.1rc-win.exe*6が出来上がっています。私はMikTeXのアップデート後の処理が抜けて!pdfTeX error: pdflatex.exe (file ts1-zi4r): Font ts1-zi4r at 540 not foundと言われたり、QPDFのパス指定を誤ったりして、修正後、make distributionをやり直しました。

3. 動作確認

Windows版ではsessionInfo()をしても使っているBLASの種類を教えてくれないのですが、マルチコアの計算機で以下のように行列演算をさせて、ユーザー時間が経過時間よりも大きければ並行処理ができているので、OpenBLASとリンクしているのが分かります。

set.seed(1013)
n <- 5000
M1 <- matrix(runif(n^2, min=1, max=10), n, n)
M2 <- matrix(runif(n^2, min=1, max=10), n, n)
system.time({ M3 <- M1 %*% M2 })

*1: 本当は古いバージョンのInno Setupが残っていたので、それで済ましています。

*2: インストール先をカスタマイズした場合は、Mkrules.localに、ISDIR = /path/to/Inno を付け加える必要があります。

*3: https://cran.r-project.org/src/base/R-latest.tar.gzを落としてくれば、リリース最新版がコンパイルできます。

*4: 無視すると「make[2]: *** 'stamp-recommended' に必要なターゲット 'MASS.ts' を make するルールがありません. 中止.」のようなことを言われて止まる.

*5: リリース版だと-rc無しで-4.2.1のようなバージョン番号がつきます。4.2リリース後は、R-patchedに展開されるようになりました。

*6:4.2リリース後はR-4.2.1patched-win.exe