BLAS ライブラリにはいくつかの実装があり,x86 アーキテクチャに対して最適化された OpenBLAS や,オートチューニングを備えた ATLAS などが有名である.この記事では,R で計算を行う際にどの BLAS 実装を使うべきかを検討するために,R 標準の BLAS,参照 BLAS,OpenBLAS,ATLAS の4つについて簡単なパフォーマンス測定を行った結果を公開する.
内容
測定対象は,R 標準の BLAS (RBLAS),参照 BLAS (RefBLAS),OpenBLAS,ATLAS の4つ.マルチスレッドに対応している OpenBLAS と ATLAS ではシングルスレッド実行 (1T) と 実コア数での並列実行 (nT) のそれぞれで記録した.
今回は,R での使用頻度が高い問題として,行列積,逆行列の計算,固有値計算,線形回帰の4つを測定することにした.2000×2000 の正方行列に対してそれぞれ5回の測定を行い,もっとも短かった時間を計算時間として記録した.測定に用いたスクリプトは後述.
実験は,研究室の CentOS サーバーと,Windows PC の2つの環境で行った.測定を正確にするため,CPU の HTT と TB は無効化している.
CentOS サーバーでのパフォーマンス
CentOS サーバーの環境は次のとおり.
CPU | 2 x Intel Xeon E5-2650 (2.00 GHz, 8 cores) |
Memory | 16 x 8GB DDR3 1333MHz (Double ch., ECC, Registered) |
OS | CentOS 6.5 64bit minimal |
R | R 3.0.2 64bit |
結果は次のようになった.数値は RBLAS を 1 とした相対速度で,大きいほど速い.
下の問題ほど性能差がなくなるのは,全体の中で BLAS の計算時間が占める割合が小さいため.
注目すべき点は,
- すべての問題で,OpenBLAS は ATLAS に勝っており,その差は並列数が大きいほど顕著である.逐次実行の場合は,そこまでの差はない.
- 固有値計算での並列 ATLAS の成績が悪い.なぜ?
- R BLAS よりも参照 BLAS のほうが,差はわずかだが一貫して速い.コンパイル時の最適化の違いか(R BLAS は -O2,参照 BLAS は -O3)?
Windows PC でのパフォーマンス
Windows PC の環境は次のとおり.
CPU | Intel Core i7 960 (3.20 GHz, 4 cores) |
Memory | 3 x 4GB DDR3 1333MHz (Triple ch.) |
OS | Windows 8.1 Enterprise 64bit |
R | R 3.0.2 for Windows 32bit |
R は CRAN から入手できるバイナリー版を使用し,OpenBLAS と 参照 BLAS は MinGW,ATLAS は Cygwin32 でビルドした.ビルドオプションはどれもデフォルト.
- OpenBLAS の方が ATLAS より速い傾向はこちらでも同じ.並列時の差が CentOS のときよりも小さく見えるのは,たぶん並列数が小さいため.
- CentOS のときは遅かった並列 ATLAS の固有値計算だが,今回は問題なかった.逆に,並列 OpenBLAS の成績は著しく悪く,逐次実行にも負けている.なぜ?
測定に使ったスクリプト
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']) time <- cbind(t1, t2, t3, t4) besttime <- apply(time, 2, min) besttime # Print results