2015-10-20 6 views
8

मेरे पास निम्नलिखित जूलिया कोड है और मैं इसे समानांतर करना चाहता हूं।जूलिया में समांतर लूप कैसे लिखें?

using DistributedArrays 

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

आउटपुट DistributedArrays.DArray[] है। मैं इस प्रकार y का मान होना चाहते हैं: y=[1,4,9,16,...,10000]

+0

समानांतर पाश में आप क्या करना चाहते हैं? मुझे लगता है कि यह एक सटीक उत्तर के बिना एक व्यापक सवाल है। –

उत्तर

3

हाय Kira,

मैं जूलिया पर नया हूँ, लेकिन एक ही समस्या का सामना करना पड़। इस दृष्टिकोण को आजमाएं और देखें कि यह आपकी आवश्यकताओं के अनुरूप है या नहीं।

function f(x) 
    return x^2; 
end 

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

println(y) 

सादर, आर एन

+0

त्वरित तरफ: यह केवल @parallel उपसर्ग के साथ क्यों काम करता है और बिना नहीं? –

+0

ऐसा लगता है (कम से कम जूलिया v0.6 में) आपको प्रत्येक कार्यकर्ता पर एफ को परिभाषित करने की आवश्यकता है, यानी @ हर जगह एफ (x) वापसी x^2; समाप्त –

9

आप उपयोग कर सकते हैं n आयामी वितरित सरणी comprehensions:

julia> addprocs(CPU_CORES - 1); 
:

सबसे पहले आप कुछ और प्रक्रियाओं, या तो स्थानीय या दूरदराज के जोड़ने की जरूरत

फिर आपको DistributedArrays का उपयोग प्रत्येक स्पैन प्रो उपकर:

julia> @everywhere using DistributedArrays 

अंत में आप इस तरह, उपयोग कर सकते हैं @DArray मैक्रो:

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 

आप देख सकते हैं यह आप क्या अपेक्षा करता है:

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

याद रखें यह एक मनमाना संख्या के साथ काम करता आयामों:

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> 

यह IM12O का इरादा करने के लिए सबसे अधिक जूलियन तरीका है।

हम क्या देखने के लिए macroexpand उत्पादन देख सकते हो रहा है:

नोट: इस उत्पादन थोड़ा, पठनीयता के लिए संपादित किया गया है T खड़ा के लिए:

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)) 
    ) 
) 

जो मूल रूप से मैन्युअल टाइपिंग जैसा ही है:

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>