2013-06-20 5 views
5

いくつかのタスクを並行して実行するために複数のforeachワーカーが関わるRコードがあります。私はこの目的のためにforeachとdoMCを使用しています。私は各foreachワーカーに新しいワーカーを募集し、コードの一部を並列化可能なものに配布するようにしたい。私はdoSNOWとdoMC here (https://www.rmetrics.org/files/Meielisalp2009/Presentations/Lewis.pdf#page=17)を用いたマルチパラダイム並列処理の例を見てforeachワーカーがサブタスクを他のワーカーに登録して配布することを許可する

require(doMC) 
require(foreach) 
registerDoMC(cores = 8) 

foreach (i = (1:8)) %dopar% { 
<<some code here>> 
    foreach (j = (1:4)) %dopar% { 
    <<some other code here>> 
    } 
} 

:私は次のようになり、理想的なコードを探しています

require(doMC) 
require(foreach) 
registerDoMC(cores = 8) 

foreach (i = (1:8)) %dopar% { 
<<some code here>> 
    for (j in c(1:4)) { 
    <<some other code here>> 
    } 
} 

:よう

現在のコードが見えます。しかし、私はそれが私が望むかどうかは分かりません。

また、Nested foreachは2つのループ(see here)をマージする必要があるため適用されませんが、私の場合はこれは好ましくありません。 2番目のループは、コードの一部について最初のループのみを助けます。私が間違っていれば私を修正してください。

ありがとうございました。

+0

あなたが望むものではないかもしれませんが、ネストされた 'foreach'式を使うことができます:http://cran.r-project.org/web/packages/foreach/vignettes/nested.pdf。しかし、私はループ内でより多くの労働者を募集することについて知らない。 – ialm

+0

ありがとうございます。しかし、ネストされたforeachは、2つのネストされたループをマージする必要があるため、私のケースには適用できませんが、コードの一部だけに呼び出される内部ループが必要です。これを反映するように質問を更新します。 – imriss

答えて

6

foreachループの内部にforeachループを持つことには特に問題はありません。ここでdoSNOWループ内doMCループの例です:

library(doSNOW) 
hosts <- c('host-1', 'host-2') 
cl <- makeSOCKcluster(hosts) 
registerDoSNOW(cl) 
r <- foreach(i=1:4, .packages='doMC') %dopar% { 
    registerDoMC(2) 
    foreach(j=1:8, .combine='c') %dopar% { 
    i * j 
    } 
} 
stopCluster(cl) 

内側のループのためdoMCを使用するように私には自然なようだが、とにかくあなたが望むそれを行うことができます。また、両方のループでdoSNOWを使用することもできますが、外側のforeachループ内でスノークラスターを作成して停止する必要があります。 4つだけ内側のループの本体を実行するが、

library(doMC) 
registerDoMC(2) 
r <- foreach(i=1:2, .packages='doMC') %dopar% { 
    ppid <- Sys.getpid() 
    registerDoMC(2) 
    foreach(j=1:2) %dopar% { 
    c(ppid, Sys.getpid()) 
    } 
} 

結果は、6つのプロセスの合計doMCパッケージで二股されていることを実証する:ここ

はdoMCループ内doMCの使用例です

> r 
[[1]] 
[[1]][[1]] 
[1] 14946 14949 

[[1]][[2]] 
[1] 14946 14951 


[[2]] 
[[2]][[1]] 
[1] 14947 14948 

[[2]][[2]] 
[1] 14947 14950 

もちろん、1つのノードであまりに多くのプロセスを開始しないように注意する必要があります。私はこの種のネスティングを少し厄介なものにしました。これは入れ子のオペレータの開発につながりました。

+0

ありがとうございます。 MOABを使用してジョブをサブミットしているため、ホスト名を選択できません。プロセッサのアフィニティを避けるために、MOAB要求内のノードとプロセッサの数を設定するベストプラクティスはありますか?たとえば、上記の最初の例では、nodes = 4; ppn = 8? – imriss

+0

@imriss MPIまたはSOCKクラスタを使用しますか? MPIの場合は、Open MPIなどを使用していますか?そしてあなたはMoabのリソースマネージャーとしてTorqueを使用していますか? –

+0

msubスクリプトの行は#PBSで始まるので、Torque/Moabだと思います。現在のコードでは、内側のループはシリアルなのに対し、外側のループにはdoMCとforeachを使用します。私は管理者特権を持っていませんが、自分のホームフォルダにパッケージをインストールできます。ありがとう。 – imriss

関連する問題