2017-11-26 4 views
0

こんにちは私は並列計算のためにdorngを勉強しています。 私は各k時間の合計実行時間を見て、データフレームに保存したいと思っています。 しかし、リストのタイムテーブルに結果が格納されているのを見ると、経過時間は負の値になります。私のコードで何が間違っていますか?並列計算を実行して経過時間負の値を格納するR

library(doParallel) 
library(doRNG) 
cl <- makeCluster(3); 
registerDoParallel(cl) 

registerDoRNG(seed = 11) 
tstart_par = proc.time() 
time_chain_par = matrix(0, 10, 2) 
timetable <- foreach(k=1:10, .options.RNG=11) %dorng%{ 
    runif(10,0,1) 
    runif(10,0,1) 
    runif(10,0,1) 
    etime_par = proc.time() - tstart_par 
} 



> timetable 
[[1]] 
user system elapsed 
    -42.559 -8.004 -1483.762 

[[2]] 
user system elapsed 
    -43.179 -8.038 -1484.064 

[[3]] 
user system elapsed 
    -42.996 -8.065 -1484.305 

[[4]] 
user system elapsed 
    -42.558 -8.004 -1483.761 

[[5]] 
    user system elapsed 
    -43.178 -8.038 -1484.063 

[[6]] 
user system elapsed 
    -42.558 -8.004 -1483.761 

[[7]] 
    user system elapsed 
    -42.996 -8.064 -1484.304 

[[8]] 
    user system elapsed 
    -43.178 -8.038 -1484.062 

[[9]] 
    user system elapsed 
    -42.558 -8.004 -1483.760 

[[10]] 
    user system elapsed 
    -43.177 -8.038 -1484.061 
+0

この状況では、 'proc.time()'の代わりにSys.time()が良い選択肢です。 –

答えて

1

proc.time()クラスタ内にリセットされるので、あなたのメインのRプロセスが新しく作成されたクラスタが負の値を与え、実行されているどのくらいの時間に実行されているどのくらいの時間を比較しています。この状況ではSys.time()関数を使用する方が良いでしょう。これは中央の時計と比較して戻ります。私は増加(

library(doParallel) 
library(doRNG) 
cl <- makeCluster(3); 
registerDoParallel(cl) 

registerDoRNG(seed = 11) 
tstart_par = Sys.time() 

timetable <- foreach(k=1:10, .options.RNG=11) %dorng%{ 
    runif(10,0,1) 
    runif(10,0,1) 
    runif(10,0,1) 
    etime_par = Sys.time() - tstart_par 
} 
stopCluster(cl) 

> timetable 
[[1]] 
Time difference of 2.897783 secs 

[[2]] 
Time difference of 2.897755 secs 

[[3]] 
Time difference of 2.899669 secs 

[[4]] 
Time difference of 2.899365 secs 

[[5]] 
Time difference of 2.899258 secs 

[[6]] 
Time difference of 2.900039 secs 

[[7]] 
Time difference of 2.901185 secs 

[[8]] 
Time difference of 2.901083 secs 

[[9]] 
Time difference of 2.901798 secs 

[[10]] 
Time difference of 2.902622 secs 

Orのあなたがproc.timeを(使用できるため、個々のクラスタが走ったどのくらいの時間)が、関数の内部でそれを置く:だから、各クラスタは処理を終了するまで、並列プロセスを開始からの時間をカウントします

cl <- makeCluster(3); 
registerDoParallel(cl) 

registerDoRNG(seed = 11) 

time_chain_par = matrix(0, 10, 2) 
timetable <- foreach(k=1:10, .options.RNG=11) %dorng%{ 
    tstart_par = proc.time() 
    runif(1000000,0,1) 
    etime_par = proc.time() - tstart_par 
} 
stopCluster(cl) 

timetable 
[[1]] 
    user system elapsed 
    0.148 0.008 0.307 

[[2]] 
    user system elapsed 
    0.145 0.008 0.249 

[[3]] 
    user system elapsed 
    0.145 0.008 0.325 

[[4]] 
    user system elapsed 
    0.062 0.002 0.130 

[[5]] 
    user system elapsed 
    0.062 0.002 0.118 

[[6]] 
    user system elapsed 
    0.061 0.003 0.110 

[[7]] 
    user system elapsed 
    0.062 0.002 0.110 

[[8]] 
    user system elapsed 
    0.061 0.003 0.149 

[[9]] 
    user system elapsed 
    0.062 0.002 0.117 

[[10]] 
    user system elapsed 
    0.097 0.003 0.169