Julia的动态调度

时间:2017-08-03 04:49:05

标签: julia

我有一个动态调度功能,我可以将它用于简单的数组和函数,例如我可以将它用于此代码:

调度:

@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

我还有另一个问题,我们如何确定我们的问题是在不同的过程中运行的?我们如何监控它?

1 个答案:

答案 0 :(得分:1)

pmap splats参数,所以这有效:

f(x,y) = x+y; pmap(f,1:5,6:10)

您可能会使用OP中的内容重新定义pmap,而OP中没有显示参数,从而失败。你不需要在这里写自己的:如果你只是使用内置版本,它将起作用。