2015-03-06 14 views
5

Julia kullanarak bazı istatistiksel analizler yapmaya çalışıyorum. Kod, script.jl (örneğin, verinin ilklendirilmesi) ve algorithm.jl dosyalarından oluşmaktadır.Julia'da bir paralel for döngüsü içinde veri yönetimi

Simülasyonların sayısı büyüktür (en az 100.000), bu nedenle paralel işlemeyi kullanmak mantıklıdır.

function script(simulations::Int64) 

# initialise input data 
... 

# initialise other variables for statistical analysis using zeros() 
... 

require("algorithm.jl") 

@parallel for z = 1:simulations 
    while true 

    choices = algorithm(data);  

    if length(choices) == 0 
     break 
    else 
     # process choices and pick one (which alters the data) 
     ... 
    end 

    end 
end 

# display results of statistical analysis 
... 

end 

ve örnek olarak

function algorithm(data) 

# actual algorithm 
... 

return choices; 

end 

, ben ortalama olarak kaç tane seçenek bilmek istiyorum, ne -

Aşağıdaki kod göstermek için benim sorum sadece bazı pseudocode olduğunu En yaygın seçim, vb. Bu amaçla ben ( sonra For döngüsü) sonuçları ( önce başlatıldı For döngüsü) istatistiksel analiz değişkenlerine (For döngüsü içinde ) choices bazı verileri kaydetmek ve görüntülemek gerekir.

@spawn ve fetch() kullanımı hakkında okudum ve pmap() gibi işlevlerim ama nasıl devam edeceğimi bilmiyorum. For-loop içindeki değişkenlerin kullanılması her proc kendi kopyasını aldığından çalışmaz, dolayısıyla for döngüsü sonrasında istatistiksel analiz değişkenlerinin değerleri sadece sıfır olur. Tek bir proc kullanırken simulasyonlar için include("script.jl") ve script(100000) kullanmak Julia ise

[Düzenle], hiçbir sorunları vardır. Bununla birlikte, birden fazla prosedür kullanıldığında (örneğin, addprocs(3) kullanılarak) tüm istatistiksel değişkenler, döngüden sonra sıfırdır - bu beklenen bir durumdur.

+0

'Algoritim 'işleviniz her zaman özdeş' veri' girdisi için özdeş 'seçenekler' döndürüyor mu? – rickhg12hs

+0

@ rickhg12hs Evet öyle. – Ailurus

+1

Daha sonra, sahte kodunuzu verdikten sonra, sadece ilk döngü ('z = 1') herhangi bir' seçimleri işlemez mi? – rickhg12hs

cevap

1

Doğal olarak bir seri işlemleri paralel hale getirmek istediğiniz görülüyor, çünkü her işlem bir diğerinin sonucuyla ilgilidir (bu durumda data).

@parallel (dosumethingwithdata) for z = 1:simulations 
    while true 

    choices = algorithm(data,z);  

    if length(choices) == 0 
     break 
    else 
     # process choices and pick one (which alters the data) 
     ... 
    end 

    data 

    end 
end 

o zaman sorun için bir paralel çözüm bulabilirsiniz: Ben sizin gibi yukarıdaki kodu uygulamak eğer düşünüyorum.