6

doMC と foreach を使用してコア間でプロセスを分散しているときに、コンピューターで奇妙な動作が発生しています。シングルコアを使用すると、2コアを使用するよりもパフォーマンスが向上する理由を誰かが知っていますか? ご覧のとおり、コア (おそらく 1 つのコアのみを使用する) を登録せずに同じコードを処理すると、はるかに時間効率の高い処理が得られます。%do% は %dopar% よりもパフォーマンスが優れているように見えますが、4 つのコアのうち 2 つのコアを登録すると、より多くの時間がかかります。

require(foreach)
require(doMC)
# 1-core
> system.time(m <- foreach(i=1:100) %dopar% 
+ matrix(rnorm(1000*1000), ncol=5000) )
   user  system elapsed 
  9.285   1.895  11.083 
> system.time(m <- foreach(i=1:100) %do% 
+ matrix(rnorm(1000*1000), ncol=5000) )
   user  system elapsed 
  9.139   1.879  10.979 

# 2-core
> registerDoMC(cores=2)
> system.time(m <- foreach(i=1:100) %dopar% 
+ matrix(rnorm(1000*1000), ncol=5000) )
   user  system elapsed 
  3.322   3.737 132.027
> system.time(m <- foreach(i=1:100) %do% 
+ matrix(rnorm(1000*1000), ncol=5000) )
   user  system elapsed 
  9.744   2.054  11.740 

いくつかの試行で 4 つのコアを使用すると、非常に異なる結果が得られます。

> registerDoMC(cores=4)
> system.time(m <- foreach(i=1:100) %dopar% 
{ matrix(rnorm(1000*1000), ncol=5000) } )
   user  system elapsed 
 11.522   4.082  24.444 
> system.time(m <- foreach(i=1:100) %dopar% 
{ matrix(rnorm(1000*1000), ncol=5000) } )
   user  system elapsed 
 21.388   6.299  25.437 
> system.time(m <- foreach(i=1:100) %dopar% 
{ matrix(rnorm(1000*1000), ncol=5000) } )
   user  system elapsed 
 17.439   5.250   9.300 
> system.time(m <- foreach(i=1:100) %dopar% 
{ matrix(rnorm(1000*1000), ncol=5000) } )
   user  system elapsed 
 17.480   5.264   9.170
4

1 に答える 1

8

すべての処理時間を消費するのは、結果の組み合わせです。これらは、cores=2結果が返されない場合のシナリオの私のマシンでのタイミングです。基本的に同じコードで、作成された行列のみが返されずに破棄されます。

> system.time(m <- foreach(i=1:100) %do% 
+ { matrix(rnorm(1000*1000), ncol=5000); NULL } )
   user  system elapsed 
 13.793   0.376  14.197 
> system.time(m <- foreach(i=1:100) %dopar% 
+ { matrix(rnorm(1000*1000), ncol=5000); NULL } )
   user  system elapsed 
  8.057   5.236   9.970 

まだ最適ではありませんが、少なくとも並列バージョンの方が高速です。

これは、次のドキュメントからのものですdoMC

このパッケージは、パッケージのマルチコア機能を使用して 、 /関数doMCの並列バックエンドを提供し ます。foreach%dopar%parallel

現在、メカニズムをparallel使用しforkて R プロセスの同一のコピーを生成します。別々のプロセスから結果を収集するのはコストのかかる作業であり、これが時間測定でわかることです。

于 2013-03-04T04:52:08.687 に答える