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)