R

トップページ
Google
WWWを検索
サイト内を検索

ループでスカラ演算を繰り返すよりもベクトル演算をした方が速い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のダウンロードとインストール、アップデートとアップデートにあわせた設定の更新をします。

  1. 公式サイトからbasic-miktex-22.3-x64.exeをダウンロードしてきて、MikTeXをインストール
  2. 付属ユーティリティMiKTeX Consoleで、
    1. administration modeを選択し、Check for updates、Update nowを実行
    2. メニューの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.winsedで置換します。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\installerR-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)
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. リリース候補版だとR-rcになり、リリース版だとR-4.2.1のようなバージョン番号がつきます。↩︎

  4. 実際、tcltk-5253-5175.zipから変わったので、入れ替えています。↩︎

  5. 試行錯誤はリリース候補版で行ないました。↩︎