0

1 つのタスクが終了した場合 (他のタスクを待ちたくない)、クラスター計算を中止し、最速の計算の戻り値を取得したい:

require(snow)
library(parallel)

tasks = list(
    job1 = function(y, cl){
        EMGMM(y=y, startMy = 0)
    },
    job2 = function(y, cl){
        EMGMM(y=y, startMy = 1)
    },
    job3 = function(y, cl){
        EMGMM(y=y, startMy = 2)
    }
)

cl = makeCluster( length(tasks) )
clusterExport(cl, "dmvnorm") #needed in EMGMM()

res = clusterApply(cl, tasks, function(f) f(y))

これを実行するresと、3 つのジョブの 3 つの結果が格納されます。しかし、私は断食の仕事の結果だけが欲しい.

:)

4

1 に答える 1

0

あなたの質問に答えるために、私はこれが可能だとは思わない。ノードは互いに独立して動作するため、次の質問につながります。ノード B が終了し、ノード B がノード A から完全に独立している場合、ノード A のプロセスをどのように停止しますか? (私の知る限りではできません)。

また、clusterApply の出力の前にすべてのノードの出力を組み合わせる調整プロセスがあることも理解しています。そのため、(ユーザーとしての) あなたの視点からは、すべてのノードの出力を同時に利用できます。 、連続した結果はありません。

どの関数が最速かを特定したい特定の理由がある場合は、いつでも RBenchmark を使用するか、関数呼び出しを簡単な system.time でラップすることができます。このサイトには RBenchmark の例がたくさんあります

並列処理を使用してこの検出を行おうとしている場合、それは適切な方法ではありません。

別の解決策 ::

ルーチンが実際に 3 つの関数すべてを実行し、最速の関数の出力を取得して続行する場合、関数の戻り値と関数の実行にかかった時間を含むリストを関数に返すようにすることができます。その情報を考慮して最速のものを選択します。そうすれば、まだ並行して実行できます。

例えば ​​-

f<-function(x){
    time<-system.time(result<-replicate(5,rnorm(x)))[3]
    list(result, time)
}
f(2)
#result
#[[1]]
#          [,1]      [,2]      [,3]       [,4]       [,5]
#[1,] -0.774092 0.2368157 0.3985423 0.16720798 -0.3073049
#[2,] -0.544825 1.5665314 1.5249368 0.04576403 -2.2738331
# 
#[[2]]
#elapsed 
#   0.03 

きれいではありませんが、それはそれを行う1つの方法です。

于 2014-09-04T22:42:55.740 に答える