OpenBLAS と ATLAS の性能を R 上で比較する

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 とした相対速度で,大きいほど速い.

perfbar-r-blas-centos

下の問題ほど性能差がなくなるのは,全体の中で 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 でビルドした.ビルドオプションはどれもデフォルト.

perfbar-r-blas-centos

  • 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

コメントを残す

メールアドレスが公開されることはありません。