J

MacのRの行列演算を高速化

1. 背景

Mac限定の方法だが、Appleは各デバイスごとに数値計算アルゴリズムを最適化しており、accelerate.framework(vecLib)といった名前で標準装備されている。

BLASLAPACKなどが実装されている。

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