我有一个动态调度功能,我可以将它用于简单的数组和函数,例如我可以将它用于此代码:
调度:
@everywhere function pmap(f,lst)
np=nprocs()
n=length(lst)
results=Vector{Any}(n)
i=1
nextidx()=(idx=i;i+=1;idx)
@sync begin
for p=1:np
if p != myid() || np==1
@sync begin
while true
idx=nextidx()
if idx > n
break
end
results[idx]= remotecall_fetch(f,p,lst[idx])
end
end
end
end
end
results
end
功能:
@everywhere f(x)=x+1
f (generic function with 1 method)
数组:
julia> arrays=SharedArray{Float64}(10)
10-element SharedArray{Float64,1}:
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
julia> arrays=[1 2 3 4 5 6 7 8 9 10]
1×10 Array{Int64,2}:
1 2 3 4 5 6 7 8 9 10
结果:
@everywhere function fsum(x)
x+1
end
pmap(fsum,arrays)
10-element Array{Any,1}:
2
3
4
5
6
7
8
9
10
11
我的问题是,如果我有这个函数和数组,我该如何使用调度函数? 功能:
@everywhere f(x,y)=x.+y
julia> x=SharedArray{Float64}(2,2)
2×2 SharedArray{Float64,2}:
0.0 0.0
0.0 0.0
julia> y=SharedArray{Float64}(2,2)
2×2 SharedArray{Float64,2}:
0.0 0.0
0.0 0.0
julia> x=[1 2;3 4]
2×2 Array{Int64,2}:
1 2
3 4
julia> y=[6 7;8 9]
2×2 Array{Int64,2}:
6 7
8 9
我想通过pmap(f,x,y)
来调用它,但我收到了这个错误:
ERROR: MethodError: no method matching pmap(::#f, ::Array{Int64,2}, ::Array{Int64,2})
You may have intended to import Base.pmap
Closest candidates are:
pmap(::Any, ::Any) at REPL[1]:2
我还有另一个问题,我们如何确定我们的问题是在不同的过程中运行的?我们如何监控它?
答案 0 :(得分:1)
pmap
splats参数,所以这有效:
f(x,y) = x+y; pmap(f,1:5,6:10)
您可能会使用OP中的内容重新定义pmap
,而OP中没有显示参数,从而失败。你不需要在这里写自己的:如果你只是使用内置版本,它将起作用。