2017-11-30 13 views
1

は、私は、次のようなものを持って言う:ジュリア:(PMAPからの早期復帰)

function f(x) 
    some_test ? true : false 
end 

私はpmap(f,some_array)をすれば、私はBoolsの一部の配列を取得します。 contains(==,p,false)の場合は何かしたいと思います。しかし、少なくとも私がfalseを1つだけ持っているなら、私はこのことをしたいと思います。私。 some_arrayが非常に大きい場合、pmapは最初に見つかるはずですfalse

some_testがかなり関わっている可能性がありますので、私は並列のforループを使用することをお勧めします。

例えば私は

p = pmap(f,some_array,[N for i = 1:some_large_value]) 
if contains(==,p,false) 
    return false 
else 
    return true 
end 

を持っていると、どのように私は101:some_large_valueをチェックからpmapを停止することができたときにi=100falseが表示された場合は?

私がしたい動作の別の例として、?pmapからこの例を取っ​​てください。

julia> pmap(x->iseven(x) ? error("foo") : x, 1:4; on_error=ex->0) 
4-element Array{Int64,1}: 
1 
0 
3 
0 

代わりのon_error=ex->0私も最初にreturnpmapをしたいと思います。何かのように

pmap(x->iseven(x) ? return : x, 1:4) 

という結果になります。

+0

これは私がこのパターンに対する質問/要求を見たのは3回目です。一度これは私の答えでした:https://stackoverflow.com/questions/43428477/julia-parallel-for-loop-with-return-statement/43545623#43545623おそらくそれは何とか役立つかもしれません。 –

+0

@DanGetz私はそのポストを見て、それの後に私の最初の試みをモデル化しました。しかし、 'some_array'で' f'が行う作業は大幅に変わる可能性があります。これは、すべての作業者が最も遅く結ばれているので、@パラレルの動作が遅くなります。 https://stackoverflow.com/questions/37846838/what-exactly-is-the-difference-between-parallel-and-pmap?rq=1を参照してください。 –

答えて

0

他のタスクが既に開始している可能性があるため、これは一般的に難しい作業です。あなたはいくつかの余分な実行をすることについてのことは心配していないなら、一つの方法は、それが行われているかどうか、例えば結果を含むタプルを返す必要があります。ここparallel computing docs

function pmap_chk(f, lst) 
    np = nprocs() # determine the number of processes available 
    n = length(lst) 
    results = Vector{Any}(n) 

    i = 0 
    nextidx() = (i+=1; i) 

    done = false 
    isdone() = done 
    setdone(flag) = (done = flag) 

    @sync begin 
     for p=1:np 
      if p != myid() || np == 1 
       @async begin 
        while !isdone() 
         idx = nextidx() 
         if idx > n 
          break 
         end 
         r, flag = remotecall_fetch(f, p, lst[idx]) 
         results[idx] = r 
         if flag 
          setdone(flag) 
         end 
        end 
       end 
      end 
     end 
    end 
    resize!(results, i) 
end 

fからpmap例を修正することです

julia> pmap_chk(1:100) do f 
     r = rand() 
     sleep(r) 
     (r, r>0.9) 
     end 
15-element Array{Any,1}: 
0.197364 
0.60551 
0.794526 
0.105827 
0.612087 
0.170032 
0.8584 
0.533681 
0.46603 
0.901562 
0.0894842 
0.718619 
0.501523 
0.407671 
0.514958 

すぐに停止しないことに注意してください。

関連する問題