2016-10-12 137 views
1

部分共享的陣列,我想改變僅我的方法的一些擁有一個共享數組:朱莉婭 - 與@parallel

julia> addprocs(4) 
4-element Array{Int64,1}: 
2 
3 
4 
5 

julia> s = SharedArray(Int, (100,), pids=[2,3]); 
julia>for i in procs() println(remotecall_fetch(localindexes, i, s)) end 
1:0 
1:50 
51:100 
1:0 
1:0 

這工作,但我希望能夠並行化循環:

julia> for i=1:100 s[i] = i end 

這導致了段錯誤終止進程4和5:

julia> @parallel for i=1:100 s[i] = i end 

問:爲什麼這個termina進程而不是拋出一個異常,或僅在共享數組的進程間分割循環?

我希望這不是工作,但它不填充整個數組:

julia> @parallel for i in localindexes(s) s[i] = i end 

每個進程更新是當地給它的陣列的一部分,因爲該數組是共享的,改變由通過一個進程應該對所有進程都可見。爲什麼有些陣列仍然保持不變?

@everywhere代替@parallel給出s未在進程2中定義的錯誤。擁有數組的一部分進程如何不知道它?

我很困惑。並行化該循環的最佳方式是什麼?

+0

這個數組有多大(理想情況下大於100個元素)? 'SharedArray'對象專爲真正的大數據而設計。此外,爲了獲得最佳性能,每個'SharedArray'參與進程只能在其自己的數組子集上工作。如果你只想要一部分處理器來更新整個數組,那麼你應該首先檢查這是否比主進程執行工作更快。主進程可以看到整個陣列並且沒有並行計算開銷,這可以抵消並行化更新的任何潛在加速。 –

+1

這可能需要更新(即將推出)並行框架的額外普遍性。現在你可以使用'@ spawnat'編寫一個實現,但這不會很靈活。 –

+0

該陣列可能足夠大,可以跨多個主機共享,例如集羣上的高分辨率CFD模擬,但我只是想了解語法現在應該如何工作。 –

回答

0

這會做詭計嗎?

@sync begin 
    for i in procs(s) # <-- note loop over process IDs of SharedArray s! 
     @async @spawnat i setindex!(s, i, localindexes(s)) 
    end 
end 

如果在這裏調用主進程,則可能會遇到問題;在這種情況下,您可以嘗試在pmap example上構建您自己的函數。

+0

沉默是震耳欲聾的...... :( –