R言語 - Intel Math Kernel Library ベンチマーク結果

#はじめに
　本 Tips では、R 環境に Intel Math Kernel Library (以下、Intel MKL)をセットアップした状態のベンチマーク結果を説明しています。結果としては、初期状態の R 環境 より およそ3倍ほど高速となる結果となりました。
　ベンチマーク環境は、ThinkPad X230 4Coreマシン(Intel64 Family 6 Model 58 Stepping 9 GenuineIntel ~2601 Mhz)です。R 環境には、Oracle R Distribution(以下、ORD) 3.2.0 を使用しています。ORD および Intel MKL のセットアップ手順については、[Intel Math Kernel Library セットアップ](http://qiita.com/uchim/items/a4d17aa0699b26e5bec0)をご参照ください。なお、ベンチマーク用のスクリプトには、[R-benchmark-25.R](http://r.research.att.com/benchmarks/R-benchmark-25.R)を使用しました。

# Intel MKL によるパフォーマンス最適化
　一般的な統計解析で行う前後処理について、R 環境そのもののパフォーマンスを最適化したいと思ったことはありませんか？統計解析前後では、データの生成や、分割や、集約について、ベクターやマトリクス、算術関数を使った処理が必ずあります。このような場合、Intel MKL を利用することによって、パフォーマンス向上を期待できます。

# ベンチマーク結果

###### 1.Matrix calculation (単位：秒)

|           処理                  | ORD+Intel MKL(スレッド数=3) | ORD(初期状態)| Open Source R  |
|:--------------------------------|-------------:|--------:|-------:|
|行列の変換操作(2,500*2,500行列)  | 1.01         | 1.01    |   1.09 |
|乱数のべき乗(2,500*2,500行列)    | 0.42         | 0.41    |   0.40 |
|乱数7,000,000のクイックソート    | 0.74         | 0.75    |   0.75 |
|線形代数クロス積(2,800*2,800行列)| 0.64         | 11.3    |   11.5 |
|クロス積の逆行列(2000*2000行列)  | 0.32         | 5.65    |   5.57 |

###### 2.Matrix functions (単位：秒)
|           処理                  | ORD+Intel MKL(スレッド数=3) | ORD(初期状態)| Open Source R  |
|:--------------------------------|-------------:|--------:|-------:|
|乱数2,400,000のフーリエ変換      | 0.49         | 0.50    |   0.50 |
|乱数(600*600行列)の固有値        | 0.75         | 0.79    |   0.80 |
|2,500*2,500行列の行列式          | 2.92         | 2.91    |   3.01 |
|3,000*3,000行列のコレスキー分解  | 0.37         | 4.48    |   4.53 |
|1,600*1,600行列のQR分解          | 0.32         | 2.97    |   2.98 |

###### 3.Programmation (単位：秒)
|           処理                  | ORD+Intel MKL(スレッド数=3) | ORD(初期状態)| Open Source R  |
|:--------------------------------|-------------:|--------:|-------:|
|3,500,000のフィボナッチ数の計算  | 0.68         | 0.67    |   0.70 |
|3,000*3,000のヒルベルト行列の生成| 0.26         | 0.27    |   0.28 |
|乱数400,000ペアの最大公約数の計算| 0.47         | 0.46    |   0.46 |
|500*500のテプリッツ行列の生成    | 0.41         | 0.44    |   0.43 |
|45*45の複雑な行列計算            | 0.40         | 0.42    |   0.43 |

###### 処理時間合計(1.～3.の合計)の比較 (単位：秒)
|           処理                  | ORD+Intel MKL(スレッド数=3) | ORD(初期状態)| Open Source R  |
|:--------------------------------|-------------:|--------:|-------:|
|処理時間合計                     | 10.2         | 33.0    |   33.4 |

######ベンチマーク用スクリプト [R-benchmark-25.R](http://r.research.att.com/benchmarks/R-benchmark-25.R) 実行時の注意点
　環境によっては、```SuppDists```パッケージをインストールする必要があるでしょう。

```R:R
install.packages("SuppDists")
```

　また、初回実行時は、スクリプト42行目にある ```remove("a", "b")``` を次のように書き換えることで実行エラーを回避しましょう。

```R:R
if (exists("a")) {remove("a")}
if (exists("b")) {remove("b")}
```



#おわりに
　本 Tips では、ベンチマーク環境に、4Coreマシンを使用しました。そのため、Intel MKL で利用できるスレッド数を「3」にして測定しました。もし、もっと Core 数の多いマシンを利用することができたなら、さらなるパフォーマンス向上を得ることができたかもしれません。Core 数の増加によるパフォーマンス向上については、別の機会にご紹介したいと思います。


#ディスクレーマー
　Tips に記載された内容は、情報の提供のみを目的としています。したがって、本 Tips に用いた内容は、必ず読者ご自身の責任と判断によってご利用ください。Tips の活用の結果について、Tips 作成者はいかなる責任も負いません。本 Tips は Oracle 社および Intel 社の製品サポートとは無関係ですので、本 Tips を元に Oracle 社および Intel 社サポートに問い合わせることはご遠慮ください。なお、本 Tips において示されている見解は、Tips 作成者の見解であって、Oracle 社および Intel 社の見解を必ずしも反映したものではありませんのでご了承ください。本 Tips 記載の情報は、2016 年 2 月 11 日時点のものを掲載していますので、ご利用時には、変更されている場合もあります。