MacのRの行列演算を高速化
1. 背景
Mac限定の方法だが、Appleは各デバイスごとに数値計算アルゴリズムを最適化しており、accelerate.framework(vecLib)
といった名前で標準装備されている。
BLAS
やLAPACK
などが実装されている。
R
への適用方法は、BLAS
のシンボリックリンクを変更するだけだ。
2. 方法
ターミナル上で
cd /Library/Frameworks/R.framework/Resources/lib ln -sf /System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Versions/Current/libBLAS.dylib libRblas.dylib
とすることで適用される。 Rstudioでも適用される。
3. テスト
これを用いて、行列演算テストを行う。 以下、結果を記載する。
################################################ ### MacBook Pro (Retina, 15-inch, Late 2013) ### ################################################ system.time(solve(matrix(runif(3000*3000),3000,3000)))['elapsed'] # elapsed # 設定前 48.756 # 設定後 1.25 set.seed(0) T <- 5 N <- 2000 A <- matrix(rnorm(N * N), N, N) ## Matrix multiplication t1 <- sapply(1 : T, function(t) system.time(A %*% A)['elapsed']) ## Matrix inversion t2 <- sapply(1 : T, function(t) system.time(solve(A))['elapsed']) ## Eigenvalues/vectors t3 <- sapply(1 : T, function(t) system.time(eigen(A))['elapsed']) ## Linear regression D <- as.data.frame(A) t4 <- sapply(1 : T, function(t) system.time(lm(V1 ~ ., data=D))['elapsed']) t1 # elapsed elapsed elapsed elapsed elapsed # 設定前 4.822 4.801 4.929 4.821 4.921 # 設定後 0.121 0.137 0.130 0.131 0.125 t2 # elapsed elapsed elapsed elapsed elapsed # 設定前 14.338 14.312 14.399 14.665 14.289 # 設定後 0.311 0.280 0.279 0.284 0.297 t3 # elapsed elapsed elapsed elapsed elapsed # 設定前 38.313 37.788 37.910 37.739 38.073 # 設定後 6.427 6.360 6.359 6.426 6.595 t4 # elapsed elapsed elapsed elapsed elapsed # 設定前 4.378 4.256 4.218 4.189 4.220 # 設定後 2.490 2.410 2.380 2.419 2.384
かなり高速化されていることが分かる。
参考
Accelerate(7) Mac OS X Manual Page https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man7/Accelerate.7.html