比如说以下例子中,共享数组是指定了大小的 3×4 :
@everywhere using SharedArrays
using Distributed
addprocs(2)
function myfill()
S = SharedArray{Float64,2}(3,4)
@distributed for i = 1:length(S)
S[i] = i
end
S
end
[out]:
3×4 SharedArray{Float64,2}:
1.0 4.0 7.0 10.0
2.0 5.0 8.0 11.0
3.0 6.0 9.0 12.0
如果我现在想新建一个空的共享数组,然后向其中添加元素:
function d()
S = SharedArray{Float64}()
@distributed for i = 1:5
append!(S,i)
end
return S
end
但是为什么没有效果呢?
[out]:
0-dimensional SharedArray{Float64,0}:
0.0
Jun
2019 年6 月 19 日 01:49
2
问题主要是,你没法改变这里SharedArray
的大小,SharedArray
定义的时候提前先分配了一块共享内存,所以对于SharedArray
就没有定义push!
,append!
之类的操作。
你可以在Main
下把你的d()
函数展开试下,@distributed 会返回一个task,状态是failed
.
那我想问一下,比如说我想往ax
中添加元素,然后并行一下提高速度:
function f(n)
ax = Vector{Float64}()
@distributed for i = 1:n
append!(ax,i)
println(ax)
end
return ax
end
这样输出的结果f(n)
都是0,我不确定用Sharedarrays
是否能解决问题呢?(或者说这个应该怎么实现呢 )
Jun
2019 年6 月 22 日 02:54
4
用SharedArray 和 一般的 Vector 都可以,取决于你的实际问题,然后对应地使用Process或者Thread,只要你提前分配好这个Array就行。
并行计算中最忌同时access同一片数据,如并行地改变大小,即append。
建议提前开好内存,然后各改各的部分,避免因为数据冲突带来的加解锁等性能冲突。
ax=SharedArray{Int}(n);
@distributed for i=1:n
ax[i]=i
end