如何在 julia 中 运行 并行函数?
How to run parallel function in julia?
我想 运行 在我所有的 4 个处理器 (intel i7) 上执行函数 f() 并获取兰兹总和,如下所示:
using Distributed;
@everywhere function f()
return sum(rand(10000))
end
@sync for w in workers()
@async begin
res = @spawnat w f()
values[w-1] = fetch(res)
end
end
但是,出现以下错误:
ERROR: TaskFailedException
nested task error: MethodError: no method matching setindex!(::typeof(values), ::Float64, ::Int64)
Stacktrace:
[1] macro expansion
@ ./REPL[58]:4 [inlined]
[2] (::var"#68#70"{Channel{Any}, Int64})()
@ Main ./task.jl:411
Stacktrace:
[1] sync_end(c::Channel{Any})
@ Base ./task.jl:369
[2] top-level scope
@ task.jl:388
请指导我解决问题![=13=]
对于您的代码,最简单的方法是(假设 Julia 已经 运行 使用 -p 4
命令行参数,或者您有 运行 addprocs(4)
:
julia> values = @distributed (append!) for i in 1:4
[f()]
end
4-element Vector{Float64}:
5001.232864826896
4999.244031827526
4966.883114472259
5014.022690758762
如果您想自己做 @spawn
,此代码有效:
julia> values = Vector{Float64}(undef, 4);
julia> @sync for w in workers()
@async values[w-1] = fetch(@spawnat w f())
end
julia> values
4-element Vector{Float64}:
5029.967318172736
4993.1064528029
5016.491407076979
5062.0706219606345
但是您的代码大部分都不起作用,因为您的 values
类型不是 Vector{Float64}
。以下是如何重现您的错误:
julia> vv()=0
vv (generic function with 1 method)
julia> vv[1]=11
ERROR: MethodError: no method matching setindex!(::typeof(vv), ::Int64, ::Int64)
我想 运行 在我所有的 4 个处理器 (intel i7) 上执行函数 f() 并获取兰兹总和,如下所示:
using Distributed;
@everywhere function f()
return sum(rand(10000))
end
@sync for w in workers()
@async begin
res = @spawnat w f()
values[w-1] = fetch(res)
end
end
但是,出现以下错误:
ERROR: TaskFailedException
nested task error: MethodError: no method matching setindex!(::typeof(values), ::Float64, ::Int64)
Stacktrace:
[1] macro expansion
@ ./REPL[58]:4 [inlined]
[2] (::var"#68#70"{Channel{Any}, Int64})()
@ Main ./task.jl:411
Stacktrace:
[1] sync_end(c::Channel{Any})
@ Base ./task.jl:369
[2] top-level scope
@ task.jl:388
请指导我解决问题![=13=]
对于您的代码,最简单的方法是(假设 Julia 已经 运行 使用 -p 4
命令行参数,或者您有 运行 addprocs(4)
:
julia> values = @distributed (append!) for i in 1:4
[f()]
end
4-element Vector{Float64}:
5001.232864826896
4999.244031827526
4966.883114472259
5014.022690758762
如果您想自己做 @spawn
,此代码有效:
julia> values = Vector{Float64}(undef, 4);
julia> @sync for w in workers()
@async values[w-1] = fetch(@spawnat w f())
end
julia> values
4-element Vector{Float64}:
5029.967318172736
4993.1064528029
5016.491407076979
5062.0706219606345
但是您的代码大部分都不起作用,因为您的 values
类型不是 Vector{Float64}
。以下是如何重现您的错误:
julia> vv()=0
vv (generic function with 1 method)
julia> vv[1]=11
ERROR: MethodError: no method matching setindex!(::typeof(vv), ::Int64, ::Int64)