Julia 如何将参数列表传递给分布式系统中的工人
对于Julia 1.5.3,我想向分布式工作者传递一个列表或参数 我首先以非分布式方式尝试:Julia 如何将参数列表传递给分布式系统中的工人,julia,distributed,Julia,Distributed,对于Julia 1.5.3,我想向分布式工作者传递一个列表或参数 我首先以非分布式方式尝试: using Distributed @everywhere begin using SharedArrays solve(a,b,c) = return (1,2,3) d_rates = LinRange(0.01, 0.33, 5) m_rates = LinRange(0.01, 0.25, 5) population_size = 10^3
using Distributed
@everywhere begin
using SharedArrays
solve(a,b,c) = return (1,2,3)
d_rates = LinRange(0.01, 0.33, 5)
m_rates = LinRange(0.01, 0.25, 5)
population_size = 10^3
max_iterations_perloop = 10^3
nb_repeats = 2
nb_params = length(d_rates)*length(m_rates)*nb_repeats
para = enumerate(Base.product(d_rates, m_rates, population_size, max_iterations_perloop, 1:nb_repeats))
results = SharedArray{Tuple{Int, Int, Int}}(nb_params)
end
for (y , x) in para
results[y] = solve(x[1], x[2], x[3])
end
效果很好。然后将最终循环更改为:
@sync @distributed for (y , x) in para
results[y] = solve(x[1], x[2], x[3])
end
然后我得到一个错误(被截断):
是否可以传递这样一个列表,如果可以,如何传递?我假设您的所有工作人员都在一台服务器上,并且您实际上已经使用
addprocs
命令添加了一些工作人员。代码的第一个问题是在所有Worker上创建SharedArray
。而SharedArray
的语法如下:
help?> SharedArray
SharedArray{T}(dims::NTuple; init=false, pids=Int[])
SharedArray{T,N}(...)
Construct a SharedArray of a bits type T and size dims across the processes specified by pids - all of which have to be on the same host. (...)
这意味着您只能从主辅助进程创建一次SharedArray
,并且可以使用pids
参数指定知道它的辅助进程(如果您没有指定pids
所有辅助进程都有权访问)
因此,您的代码将如下所示:
using Distributed, SharedArrays
addprocs(4)
@everywhere using SharedArrays
@everywhere solve(a,b,c) = return (1,2,3)
#(...) # your setup code without @everywhere
results = SharedArray{Tuple{Int, Int, Int}}(nb_params)
@sync @distributed for (y , x) in collect(para)
results[y] = solve(x[1], x[2], x[3])
end
请注意,您将需要收集
,因为@distributed
宏需要知道向量的大小
,并且它不适合迭代器
using Distributed, SharedArrays
addprocs(4)
@everywhere using SharedArrays
@everywhere solve(a,b,c) = return (1,2,3)
#(...) # your setup code without @everywhere
results = SharedArray{Tuple{Int, Int, Int}}(nb_params)
@sync @distributed for (y , x) in collect(para)
results[y] = solve(x[1], x[2], x[3])
end