2016-07-08 7 views
0

次のコードは非常に簡単に実行できるはずです。シーケンシャルモードでは、1秒未満で実行されます。しかし、私がそれを平行にすると、一見永遠に走ることになります。ベクトルの長さを100に設定すると、コードは正常に動作し、構造的な問題ではないと思います。次のコードの並列化が実行に時間がかかりすぎるのはなぜですか?

library(foreach) 
    library(doParallel) 
    cl <- makeCluster(4) 
    registerDoParallel(cl) 
    bvec <-as.vector(1:1e3) 
    avec <-as.vector(1:1e3) 
    sim= function(x,y) 10*x+y 
    system.time(x <- 
     foreach(b=bvec, .combine='cbind') %:% 
     foreach(a=avec, .combine='c') %dopar% { 
     sim(a, b) 
     }) 

キャッチとは何ですか? ありがとうございます。

+0

少しお寄せくださいますか? – Theoden

+0

あなたはコンピュータを持っていないと仮定し、計算を完了する必要があります。あなたは3つの友人の手紙を送って計算の一部をするよう依頼し、彼らはそれを行い、あなたに結果を送り返し、あなたはそれをすべてまとめます。それぞれの計算に時間がかかる場合は、メールを待たなくても効率的です。しかし、各計算が非常に簡単な場合は、自分で行う方が速いでしょう。 – Gregor

+0

たとえば、1回の計算に1か月かかる場合は、自分で4ヶ月かかりますが、メールで4日待っても、1ヶ月+ 4日間は友人と一緒になります。しかし、各計算に1時間かかる場合は、自分で4時間、友人で4日+ 1時間で行うことができます。メールを待っているだけであなたが遅くなります。 – Gregor

答えて

1

並列処理にはかなりのオーバーヘッドが必要です。あなたの 'sim'関数は計算上安価であるため、オーバーヘッドのコストは 'sim'を並列実行することによるパフォーマンス上の利点を圧倒します。そのため、ベクトルの長さを長くすると期待される結果が得られます。

関連する問題