4

64 コアの x86_64-redhat-linux-gnu マシンで R (バージョン 2.15) のブートストラップ演習用に以下のコード スニペットを実行すると、4 コアを超えると計算時間が低下するように見えます。R が 5 つ以上のコアを使用するために必要な追加の構成変更はありますか?

library(doMC)
library(plyr)
df <- empty <- data.frame(cores = numeric(), trial = numeric(), time = numeric())

for(i in 1:64){
     registerDoMC(cores=i)
     trials <- 1000
     stime <- system.time({
              r <- foreach(icount(trials), .combine=cbind) %dopar% {
                   ind <- sample(1000000, 1000000, replace=TRUE)
                   mean(ind)}})
     df<- rbind(df, data.frame(cores=i,trial=1,time=stime[3]))
}
df2 <- ddply(df, c("cores"), summarize, time_avg = mean(time))

以下はコア数別の処理時間の内訳です。

num_cores time(seconds)
1   16.544
2   8.198
3   5.627
4   4.313
5   7.045
6   8.898
7   10.412
8   11.539
9   12.382
10  13.329
11  13.786
12  14.375
13  14.977
14  15.095
15  14.984
16  15.393
17  15.728
18  15.983
19  16.039
20  15.947
21  16.101
22  16.365
23  16.549
24  16.687
25  17.022
26  17.116
27  17.212
28  17.548
29  17.605
30  17.672
31  18.067
32  18.158
33  16.884
34  17.2
35  17.167
36  17.178
37  17.516
38  17.425
39  17.449
40  17.845
41  17.758
42  17.74
43  18.093
44  14.481
45  14.25
46  18.441
47  18.294
48  18.311
49  18.694
50  18.692
51  15.936
52  16.495
53  16.512
54  18.627
55  19.019
56  18.631
57  13.916
58  19.227
59  19.225
60  13.606
61  18.029
62  19.392
63  19.378
64  19.753
4

1 に答える 1

2

R の構成の問題ではないと思います。タスクが非常に小さいため、多くのコアを利用することはできません。「1 コア」の時間から、各タスクにかかる時間は 16.5 ミリ秒未満であり、おそらくそれよりもはるかに短い時間です。このforeachパッケージは、そのような細かい問題には対応していません。

希望を持たせるために、明示的なチャンクを使用してみることができます:

r <- foreach(n=idiv(trials, chunks=getDoParWorkers()), .combine='c') %dopar% {
  sapply(seq_len(n), function(i) mean(sample(1000000, 1000000, replace=TRUE)))
}

あなたの目標が何であるかはわかりませんが、mclapplyこの種の問題に直接使用します。

于 2013-04-03T15:22:24.587 に答える