我想改变仅由我的一些进程拥有的共享数组:
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
问题:为什么这会终止进程而不是抛出异常或仅在共享数组的进程中分割循环?
我希望这可以工作,但它不会填满整个数组:
julia> @parallel for i in localindexes(s) s[i] = i end
每个进程都会更新其本地数组的部分,并且由于数组是共享的,因此一个进程所做的更改应该对所有进程可见。为什么一些阵列仍然没有改变?
用@parallel
替换@everywhere
会产生错误,即在进程2中未定义s
。如何拥有部分数组的进程不知道它?
我很困惑。并行化这个循环的最佳方法是什么?
答案 0 :(得分: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建模功能。