Я работаю с кодом в Джулии и использую параллельные вычисления. Вот функция, которую я использую (упрощенная по сравнению с реальной).
Я пытаюсь оценить то, что я назвал «Время удара»:
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
, так как массивы имеют разные размеры, так как же написать код для хранения этих значений?
@PrzemyslawSzufel Я упростил вопрос, как вы и предложили. думаю теперь понятнее :)
Вам нужно иметь 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)
Или многопоточность вместо многопроцессорности
Да, пока не более 16 потоков. Для крупномасштабных задач многопроцессорность (или распределенные вычисления) оказывается лучшим вариантом.
Теперь, когда вы знаете ответ, пожалуйста, упростите свой вопрос, чтобы сделать его читабельным и удобным для других.