有关SharedArrays的问题


#1

比如说以下例子中,共享数组是指定了大小的 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

#2

问题主要是,你没法改变这里SharedArray的大小,SharedArray定义的时候提前先分配了一块共享内存,所以对于SharedArray就没有定义push!,append!之类的操作。

你可以在Main下把你的d()函数展开试下,@distributed 会返回一个task,状态是failed.


#3

那我想问一下,比如说我想往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是否能解决问题呢?(或者说这个应该怎么实现呢 :joy:


#4

用SharedArray 和 一般的 Vector 都可以,取决于你的实际问题,然后对应地使用Process或者Thread,只要你提前分配好这个Array就行。


#5

并行计算中最忌同时access同一片数据,如并行地改变大小,即append。
建议提前开好内存,然后各改各的部分,避免因为数据冲突带来的加解锁等性能冲突。

ax=SharedArray{Int}(n);
@distributed for i=1:n
    ax[i]=i                
end