Julia 中的并行计算
Parallel computation in Julia
我正在使用 Julia 中的代码并使用并行计算。这是我正在使用的功能(从真实功能中简化而来)。
我正在尝试评估我所谓的“击球时间”:
using Distributed
using LinearAlgebra
function action(Ntraj::Int64,
Tfinal::Float64,
dt::Float64)
# Output time vector
t = (1 : Ntime) * dt
#Vectors of Hitting Times
HittingTime = zeros(Ntraj)
@distributed for ktraj = 1 : Ntraj
HittingTimeBool = false
for jt=1:Ntime
if (HittingTimeBool == false && jt >0.1)
HittingTimeBool=true
HittingTime[ktraj] = jt*dt
println(HittingTime[ktraj])
end
end
end
println(HittingTime)
return (HittingTime)
end
所以我 运行 5 个轨迹的函数(只是想看看会发生什么),下面是结果
using Distributed
addprocs(4)
@everywhere include("untitled.jl")
(t, Fid, HittingTime) = @time action(5,10.,0.01);
From worker 2: 0.01
From worker 5: 0.01
From worker 3: 0.01
From worker 4: 0.01
From worker 6: 0.01
[0.0, 0.0, 0.0, 0.0, 0.0]
0.723837 seconds (121.59 k allocations: 6.331 MiB)
HittingTime
5-element Array{Float64,1}:
0.0
0.0
0.0
0.0
0.0
可以看到,在for循环中函数进入if,存储HittingTime[ktraj] = jt*dt
的值。但是当 for 循环结束时,HittingTime 数组中的值似乎消失了!我不能将 hcat 用于 FidelitytoTarget
,因为数组具有不同的维度,那么我如何编写一些代码来存储这些值?
你需要有一个 SharedArray
来改变所有工人的状态。
using Distributed, SharedArrays
addprocs(4)
HittingTime=SharedArray{Float64}(nworkers())
res = @distributed (+) for i in 1:length(HittingTime)
HittingTime[i] = rand()
HittingTime[i]
end
@assert res ≈ sum(HittingTime)
我正在使用 Julia 中的代码并使用并行计算。这是我正在使用的功能(从真实功能中简化而来)。
我正在尝试评估我所谓的“击球时间”:
using Distributed
using LinearAlgebra
function action(Ntraj::Int64,
Tfinal::Float64,
dt::Float64)
# Output time vector
t = (1 : Ntime) * dt
#Vectors of Hitting Times
HittingTime = zeros(Ntraj)
@distributed for ktraj = 1 : Ntraj
HittingTimeBool = false
for jt=1:Ntime
if (HittingTimeBool == false && jt >0.1)
HittingTimeBool=true
HittingTime[ktraj] = jt*dt
println(HittingTime[ktraj])
end
end
end
println(HittingTime)
return (HittingTime)
end
所以我 运行 5 个轨迹的函数(只是想看看会发生什么),下面是结果
using Distributed
addprocs(4)
@everywhere include("untitled.jl")
(t, Fid, HittingTime) = @time action(5,10.,0.01);
From worker 2: 0.01
From worker 5: 0.01
From worker 3: 0.01
From worker 4: 0.01
From worker 6: 0.01
[0.0, 0.0, 0.0, 0.0, 0.0]
0.723837 seconds (121.59 k allocations: 6.331 MiB)
HittingTime
5-element Array{Float64,1}:
0.0
0.0
0.0
0.0
0.0
可以看到,在for循环中函数进入if,存储HittingTime[ktraj] = jt*dt
的值。但是当 for 循环结束时,HittingTime 数组中的值似乎消失了!我不能将 hcat 用于 FidelitytoTarget
,因为数组具有不同的维度,那么我如何编写一些代码来存储这些值?
你需要有一个 SharedArray
来改变所有工人的状态。
using Distributed, SharedArrays
addprocs(4)
HittingTime=SharedArray{Float64}(nworkers())
res = @distributed (+) for i in 1:length(HittingTime)
HittingTime[i] = rand()
HittingTime[i]
end
@assert res ≈ sum(HittingTime)