R言語 - ハイパフォーマンスコンピューティング

#はじめに
　R環境のハイパフォーマンスコンピューティング(HPC:High-Performance Computing)の領域は急速に変化し続けています。現時点、[CRAN Task View: High-Performance and Parallel Computing with R](https://cran.r-project.org/web/views/HighPerformanceComputing.html)で確認できる情報を整理しました。「ハイパフォーマンスコンピューティング」といっても、たとえば、コンパイル、並列コンピューティング、大規模オブジェクト、プロファイリングといったような広範囲なトピックになっています。

#明示的な並列コンピューティング

##rpvm
並列仮想マシン(Parallel Virtual Machine)による並列処理。Li & Rossini によって提供。[CRAN の rpvm のアーカイブ](https://cran.r-project.org/src/contrib/Archive/rpvm/)から入手可能。ただし、現時点ではメンテナンスされていない。

##[Rmpi](https://cran.r-project.org/web/packages/Rmpi/index.html)
並列コンピューティングのデファクトスタンダードである[MPI](https://en.wikipedia.org/wiki/Message_Passing_Interface)(Message Passing Interface)のR版。Yuによって提供。MPI APIから多彩なアクセスが可能であり、さらに R 固有の機能拡張もある。現在も積極的にメンテナンスされている。


##[pbdMPI](https://cran.r-project.org/web/packages/pbdMPI/index.html)
SPMD(Single Program/Multiple Data)の並列処理をサポートするために、[MPI](https://en.wikipedia.org/wiki/Message_Passing_Interface)をダイレクトインターフェイスする S4 クラスを提供。

##[pbdSLAP](https://cran.r-project.org/web/packages/pbdSLAP/index.html)
[pbdMPI](https://cran.r-project.org/web/packages/pbdMPI/index.html) を利用した線形代数パッケージ。

##[pbdDMAT](https://cran.r-project.org/web/packages/pbdDMAT/index.html)
ビッグデータ・プログラミングのための機能を提供。

##[pbdBASE](https://cran.r-project.org/web/packages/pbdBASE/index.html)
[pbdDMAT](https://cran.r-project.org/web/packages/pbdDMAT/index.html) 上の分散データを扱うクラスとメソッドを提供。pbdMPI を利用している。

##[pbdNCDF4](https://cran.r-project.org/web/packages/pbdNCDF4/index.html)
テラバイト級のファイルサイズの単一ファイルへのマルチプロセス操作を許可する

##[pbdPROF](https://cran.r-project.org/web/packages/pbdPROF/index.html)
SPMDコードによるMPIコミュニケーションのプロファイル機能を提供。
fpmpi、MPIP、またはTAUなどのMPIプロファイリングライブラリを介している。

##[nws](https://cran.r-project.org/web/packages/nws/index.html)
nws(NetWorkSpaces)は、以前からある [LindaSpaces](http://www.lindaspaces.com/about/index.html)アプローチの後継であり、Python用のイベント駆動型のネットワークプログラミングフレームワーク [Twisted](https://en.wikipedia.org/wiki/Twisted_(software)) 上に実装されている。REvolution Computing から提供。

##[snow](https://cran.r-project.org/web/packages/snow/index.html)
snow(Simple Network of Workstations)は、Tierney らによるもの。PVM, MPI, NWS だけでなく、抽象化レイヤによって通信を隠ぺいする直接的なネットワークソケットを利用可能にする。[snowFT](https://cran.r-project.org/web/packages/snowFT/index.html) は、snow のフォルト・トレランス拡張版。

##[snowfall](https://cran.r-project.org/web/packages/snowfall/index.html)
snow の機能を、順次処理または並列処理のモード選択を可能にする。Knaus によって提供。

##[foreach](https://cran.r-project.org/web/packages/foreach/index.html)
明示的なループカウンターなしにコレクション内の要素の一般的な反復を可能にする。foreach を使うと、[doMC](https://cran.r-project.org/web/packages/doMC/index.html)、[doSNOW](https://cran.r-project.org/web/packages/doSNOW/index.html)、[doMPI](https://cran.r-project.org/web/packages/doMPI/index.html)、[doRedis](https://cran.r-project.org/web/packages/doRedis/index.html) パッケージ経由の並列処理のループ処理での使用が容易になる。

##[future](https://cran.r-project.org/web/packages/future/index.html)
future のファンクションコールもしくは割り当てた変数(Promise と呼ばれる)によって、同期(順次)/非同期(並列)の評価を可能にする。

##[Rborist](https://cran.r-project.org/web/packages/Rborist/index.html)
ランダムフォレストアルゴリズムの並列処理を可能にする。アルゴリズムのパフォーマンスネックとなる、データの再ステージングと分割基準の決定において、マルチコアの効率的な利用を促進するために、[OpenMP](http://openmp.org/wp/) を採用している。

##[h2o](https://cran.r-project.org/web/packages/h2o/index.html)
[H2O](http://www.h2o.ai/)の機械学習環境に接続するパッケージ。ランダムフォレスト、GBM、GLM([Elastic Net 正則化](https://en.wikipedia.org/wiki/Elastic_net_regularization)を含む)、ディープラーニングのスケーラブルな実装を可能にする。


#暗黙的な並列コンピューティング
##pnmath
この機能は、まだ、[CRAN](https://cran.r-project.org/) に統合されていない。(いずれは統合されることが期待される) gcc 4.2以降のコンパイラで、[OpenMP](http://openmp.org/wp/) 並列処理のディレティブとして利用可能な機能を提供。ユーザーからの明示的な要求無く、利用可能なマルチコアに応じた内部のR関数の数を書き換えることで、暗黙的な並列処理を実現する。なお、gcc 4.2より前の場合は、[pnmath0](http://homepage.stat.uiowa.edu/~luke/R/experimental/) パッケージによる、[Pthreads](https://en.wikipedia.org/wiki/POSIX_Threads) を使用して実現できる。

##romp
この機能は、R-Forge project「[romp](http://r-forge.r-project.org/projects/romp/)」が開始されたが、[CRAN](https://cran.r-project.org/) に統合されていない。Jamitzky の [useR! 2008 での発表](http://www.statistik.tu-dortmund.de/useR-2008/slides/Jamitzky.pdf)によると、Fortranを使用して、[OpenMP](http://openmp.org/wp/) の他のインターフェイスを提供する。pre-alpha のコードは、[Google Code project の romp](https://code.google.com/archive/p/romp/) から入手可能。

##R/parallel
並列実行のための、C++ ベースのマスター・スレーブ・ディスパッチ方式を提供。Vera、Jansen、Suppi によって提供。詳細は、[R/parallel framework](http://www.rparallel.org/)

##[Rdsm](https://cran.r-project.org/web/packages/Rdsm/index.html)
分散共有メモリプログラミングの発想で、スレッド・ライクな並列コンピューティング環境を提供。

##[RhpcBLASctl](https://cran.r-project.org/web/packages/RhpcBLASctl/index.html)
利用可能な [BLAS(e.g. Intel Math Kernel Library)](https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms) コア数を検出し、コア数の明示的な選択を可能にする機能を提供。

##[Rhpc](https://cran.r-project.org/web/packages/Rhpc/index.html)
[MPI](https://en.wikipedia.org/wiki/Message_Passing_Interface) 経由の *apply() スタイルの割り当てを可能にする。


#グリッドコンピューティング

##multiR
Grose の [useR! 2008 での発表](https://www.r-project.org/conferences/useR-2008/abstracts/Grose.pdf)があったが、リリースされていない。グリッドコンピューティングプラットフォーム版の [snow](https://cran.r-project.org/web/packages/snow/index.html) 型フレームワークが提供される予定。

##biocep-distrib
Chine が、ローカル、グリッド、クラウド・コンピューティングのためのJavaベースのフレームワークを提供。[biocep-distrib プロジェクト](http://r-forge.r-project.org/projects/biocep-distrib/)において、活発な開発が行われている。


#Hadoop
##RHIPE
[RHIPE](https://github.com/saptarshiguha/RHIPE/) は、R と Hadoop のインターフェイスを提供。ビッグデータを分析するための、データ分割と再結合のアプローチを可能にする。Saptarshi Guha によって提供。

##rmr
[rmr](https://github.com/RevolutionAnalytics/RHadoop/wiki) は、R と Hadoop のインターフェイスを提供。Map/Reduce プログラミング・フレームワークを利用可能にする。Revolution Analytics から提供。

##segue
[segue](https://code.google.com/archive/p/segue/ ) は、AWS(Amazon Web Services) での EMR(Elastic Map Reduce) を利用した並列処理を簡単に実行することができる。Long によって提供。

##[RProtoBuf](https://cran.r-project.org/web/packages/RProtoBuf/index.html)
構造化されたデータをシリアライズするための Google の言語に中立な、プラットフォームに依存しない、拡張可能なメカニズムへのインターフェイスを提供する。

##[HistogramTools](https://cran.r-project.org/web/packages/HistogramTools/index.html)
MapReduce アプリケーションの Mapper によって作成された構造体、集計、操作、および多数のヒストグラムのプロットのための便利なルーチンを提供する。

##[toaster](https://cran.r-project.org/web/packages/toaster/index.html)
並列/分散型の Teradata Aster 分析プラットフォームを利用したデータベース処理を提供する。

#ランダム・ナンバー
##[rlecuyer](https://cran.r-project.org/web/packages/rlecuyer/index.html)
並列コンピューティングのための乱数発生器を提供。Sevcikova と Rossini によって提供。

##[doRNG](https://cran.r-project.org/web/packages/doRNG/index.html)
再現可能な並列のforeachループを実行するための機能を提供。[rsteam](https://cran.r-project.org/web/packages/rstream/index.html)によって生成された独立したランダムなストリームを使って、異なるforeachのバックエンドへの最適化が可能。


#コンパイル済みコードへの簡単なインターフェイス
##[inline](https://cran.r-project.org/web/packages/inline/index.html)
C, C++ or Fortran から R へ、コードを容易に追加する機能を提供。コンパイル、R 文字列として格納された組み込みコード部分のリンクとロードを可能にする。Sklyar らによって提供。

##[Rcpp](https://cran.r-project.org/web/packages/Rcpp/index.html)
R ⇔ C++ の双方向の変換を容易にする機能を提供。また、[RInside](https://cran.r-project.org/web/packages/RInside/index.html) は、より高速で直接的なデータ・トランスファーのための C++ アプリケーション内への R の組み込みを容易にする機能を提供。Eddelbuettel と Francois によって提供。

##[rJava](https://cran.r-project.org/web/packages/rJava/index.html)
Java への(C や C++ の".Call()"のような)低レベルのインターフェイスを提供。Urbanek によって提供。

#注意点
　本 Tips では、[CRAN Task View: High-Performance and Parallel Computing with R](https://cran.r-project.org/web/views/HighPerformanceComputing.html) の全ての情報を整理していない点、また、掲載のパッケージについて未検証である点を予めご容赦ください。