web-dev-qa-db-ja.com

Rにすべてのプロセッサを使用させるには?

Windows XPを実行しているクアッドコアラップトップを持っていますが、タスクマネージャーRを見ると、一度に1つのプロセッサしか使用していないようです。 Rに4つのプロセッサすべてを使用させ、Rプログラムを高速化するにはどうすればよいですか?

30
David Smith

「for」ループでプログラムを並列化するために使用する基本的なシステムがあります。この方法は、何をする必要があるかを理解すれば簡単です。ローカルコンピューティングでのみ機能しますが、それはあなたが望んでいるようです。

これらのライブラリをインストールする必要があります。

library("parallel")
library("foreach")
library("doParallel")

まず、コンピューティングクラスタを作成する必要があります。私は通常、並列プログラムの実行中に他のことを行うため、1つは開いたままにしておきます。 「detectCores」関数は、コンピューターのコアの数を返します。

cl <- makeCluster(detectCores() - 1)
registerDoParallel(cl, cores = detectCores() - 1)

次に、「foreach」コマンドと%dopar%演算子を使用してforループを呼び出します。私は常に「try」ラッパーを使用して、操作が失敗したすべての反復が破棄され、他の点では適切なデータを中断しないようにします。 ".combine"パラメータを指定し、必要なパッケージをループに渡す必要があります。 「i」は「in」演算子ではなく、等号で定義されていることに注意してください。

data = foreach(i = 1:length(filenames), .packages = c("ncdf","chron","stats"),
               .combine = rbind) %dopar% {
  try({
       # your operations; line 1...
       # your operations; line 2...
       # your output
     })
}

完了したら、次のコードでクリーンアップします。

stopCluster(cl)
42
hangmanwa7id

Rを使用したハイパフォーマンスコンピューティングのCRANタスクビュー には、いくつかのオプションが一覧表示されます。 XPは制限ですが、それでも snow のようなものを取得してソケットを使用します数分以内に。

29

バージョン2.15以降、Rにはマルチコア計算のネイティブサポートが付属しています。並列パッケージをロードするだけです

library("parallel")

関連するビネットを確認してください

vignette("parallel")
15
csgillespie

REvolution R は、より優れたマルチスレッディングをサポートし、RとREvolutionの典型的なCRANバージョンは、Windowsで64ビットRもサポートしていると聞いています。私はコピーの購入を検討してきましたが、価格が不透明であることがわかりました。彼らのウェブサイトには価格表はありません。非常に奇妙な。

7
JD Long

multicoreパッケージはXPで動作すると思います。特にlapply()のドロップイン置換と新しいスレッドで式を評価する簡単な方法(mcparallel())を提供することにより、いくつかの基本的なマルチプロセス機能を提供します。

6
Peter M

Windowsでは、デビッド・スミスが言ったように、これを行う最善の方法はおそらくforeachとsnowを使用することだと思います。

ただし、Unix/Linuxベースのシステムは、「マルチコア」パッケージで複数のプロセスを使用して計算できます。これは、複数のコアにわたってリスト内包を実行する「mclapply」という高レベルの関数を提供します。 「マルチコア」パッケージの利点は、各プロセッサが変更できるグローバル環境のプライベートコピーを取得できることです。最初は、このコピーはグローバル環境へのポインタにすぎず、グローバル環境が読み取り専用として扱われる場合、変数の共有が非常に高速になります。

Rmpiでは、「マルチコア」クロージャーアプローチではなく、Rプロセス間でデータを明示的に転送する必要があります。

-ダン

2
ephpostfacto

多くのマトリックス操作を行い、Windowsを使用している場合は、 revolutionanalytics.com/revolution-r-open を無料でインストールできます。これには、マルチスレッドを実行できるインテルMKLライブラリが付属しています行列演算。 Windowsの場合、そのインストールからlibiomp5md.dll、Rblas.dll、Rlapack.dllファイルを取得し、使用するRバージョンのファイルを上書きすると、マルチスレッドマトリックス操作が実行されます(通常、10〜20倍のスピードアップが得られます)行列演算用)。または、 prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/windows/x64 からAtlas Rblas.dllを使用することもできます。これは、64ビットRでも動作し、MKLとほぼ同じ速度ですもの。これは、WindowsシステムでRのパフォーマンスを大幅に向上させるための最も簡単な方法であることがわかりました。それらがR Windowsインストールで実際に標準として付属していない理由がわかりません。

Windowsでは、残念ながらマルチスレッドはRで十分にサポートされていません(ただし、 OpenMP via Rcpp を使用する場合を除く)。Windowsシステムで使用可能な SOCKETベースの並列化(例:パッケージ並列))は非常に非効率的です。 POSIXシステムでは、forkを使用できるため、状況は改善されます。 (パッケージmulticore最も効率的なパッケージがあると思います)。共有メモリモデル内のマルチスレッド化にパッケージRdsmを使用することもできます-私のgithubには、フラグが付いていない-unixのみのフラグがあり、Windowsでも動作するバージョンがあります(以前のWindowsはサポートされていませんでした)依存関係bigmemoryはおそらくWindowsでは機能しませんでしたが、現在は機能しているようです):

library(devtools)
devtools::install_github('tomwenseleers/Rdsm')
library(Rdsm)
0
Tom Wenseleers