2015-10-20 14 views
8

Aşağıdaki Julia koduna sahip ve bunu parallelize istiyorum.Julia'da bir paralel döngü nasıl yazılır?

using DistributedArrays 

function f(x) 
    return x^2; 
end 
y = DArray[] 
@parallel for i in 1:100 
    y[i] = f(i) 
end 
println(y) 

Çıktı DistributedArrays.DArray[]. y=[1,4,9,16,...,10000]

+0

Paralel döngüde ne yapmak istersiniz? Bence kesin bir cevap olmadan geniş bir soru. –

cevap

3

Merhaba Kira,

Ben Julia'yı yeni ama aynı sorunla karşı karşıya: Ben şöyle y değerini almasını istiyoruz. Bu yaklaşımı deneyin ve ihtiyaçlarınızı karşılayıp karşılamadığını görün.

function f(x) 
    return x^2; 
end 

[email protected] vcat for i= 1:100 
f(i); 
end; 

println(y) 

Selamlar, RN

+0

Hızlı kenara: Neden bu sadece @parallel önek ile çalışıyor ve değil mi? –

+0

Bu her işçinin en f tanımlamak gerekir (en azından Julia v0.6 olarak) görülmektedir, yani @everywhere f (x) geri x^2; son –

9
kullanabilirsiniz

n boyutlu dağıtılan dizi comprehensions:

julia> addprocs(CPU_CORES - 1); 
:

Önce yerel veya uzak ya biraz daha süreçleri, eklemem gerekiyor

Sonra yanlısı kökenli her birindeDistributedArrays kullanmalıdır proseslerine:

julia> @everywhere using DistributedArrays 

Son olarak böyle, @DArray makro kullanabilirsiniz:

julia> x 
10-element DistributedArrays.DArray{Int64,1,Array{Int64,1}}: 
    1 
    4 
    9 
    16 
    25 
    36 
    49 
    64 
    81 
100 

bunun keyfi bir sayı ile çalışır Unutmayın:

julia> x = @DArray [@show x^2 for x = 1:10]; 
     From worker 2: x^2 = 1 
     From worker 2: x^2 = 4 
     From worker 4: x^2 = 64 
     From worker 2: x^2 = 9 
     From worker 4: x^2 = 81 
     From worker 4: x^2 = 100 
     From worker 3: x^2 = 16 
     From worker 3: x^2 = 25 
     From worker 3: x^2 = 36 
     From worker 3: x^2 = 49 

Bunu beklediğiniz yapar görebilirsiniz boyutları:

julia> y = @DArray [@show i + j for i = 1:3, j = 4:6]; 
     From worker 4: i + j = 7 
     From worker 4: i + j = 8 
     From worker 4: i + j = 9 
     From worker 2: i + j = 5 
     From worker 2: i + j = 6 
     From worker 2: i + j = 7 
     From worker 3: i + j = 6 
     From worker 3: i + j = 7 
     From worker 3: i + j = 8 

julia> y 
3x3 DistributedArrays.DArray{Int64,2,Array{Int64,2}}: 
5 6 7 
6 7 8 
7 8 9 

julia> 

Bu IMHO amaçlanan ne yapacağını en Julian yoludur. Biz ne görebilmek için macroexpand çıkışta

bakabilirsiniz oluyor:

Not:

DistributedArrays.Tuple{DistributedArrays.Vararg{DistributedArrays.UnitRange{DistributedArrays.Int}}} 

julia> macroexpand(:(@DArray [i^2 for i = 1:10])) 
    :(
    DistributedArrays.DArray(
     (
     #231#I::T -> begin 
      [i^2 for i = (1:10)[#231#I[1]]] 
     end 
    ), 
     DistributedArrays.tuple(DistributedArrays.length(1:10)) 
    ) 
) 

: Bu çıkış hafifçe T standları için, okunabilirlik için düzenlendi Hangi temelde gibi manuel yazarak aynıdır:

julia> n = 10; dims = (n,); 

julia> DArray(x -> [i^2 for i = (1:n)[x[1]]], dims) 
10-element DistributedArrays.DArray{Any,1,Array{Any,1}}: 
    1 
    4 
    9 
    16 
    25 
    36 
    49 
    64 
    81 
100 

julia>