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