2016-02-05 19 views
7

मैं जुलिआ में समानांतर प्रोग्रामिंग के लिए दस्तावेज़ों का पालन कर रहा हूं और मेरे दिमाग के लिए, जो ओपनएमपी या एमपीआई की तरह सोचता है, मुझे डिज़ाइन पसंद काफी अजीब लगता है।जूलिया में समानांतर प्रोग्रामिंग

मेरे पास एक ऐसा एप्लिकेशन है जहां मैं प्रक्रियाओं के बीच डेटा वितरित करना चाहता हूं, और फिर मैं प्रत्येक प्रक्रिया को कुछ भी ऑपरेशन लागू करने के लिए कुछ प्रक्रियाओं को लागू करना चाहता हूं, फिर भी मुझे जूलिया में ऐसा करने का कोई तरीका नहीं दिख रहा है। यहां एक उदाहरण है

julia> r = remotecall(2, rand, 2) 
RemoteRef{Channel{Any}}(2,1,30) 

julia> fetch(r) 
2-element Array{Float64,1}: 
0.733308 
0.45227 

इसलिए प्रक्रिया 2 पर 2 तत्वों के साथ एक यादृच्छिक सरणी रहता है। मैं

julia> remotecall_fetch(2, getindex, r, 1) 
0.7333080770447185 

के माध्यम से इस सरणी के लिए कुछ समारोह लागू कर सकते हैं लेकिन क्यों यह काम नहीं करता है, तो मैं एक समारोह जो वेक्टर बदलना चाहिए, जैसे लागू होते हैं:

julia> remotecall_fetch(2, setindex!, r, 1,1) 
ERROR: On worker 2: 
MethodError: `setindex!` has no method matching setindex!(::RemoteRef{Channel{Any}}, ::Int64, ::Int64) 
in anonymous at multi.jl:892 
in run_work_thunk at multi.jl:645 
[inlined code] from multi.jl:892 
in anonymous at task.jl:63 
in remotecall_fetch at multi.jl:731 
in remotecall_fetch at multi.jl:734 

मैं काफी कैसे पता नहीं है इसका वर्णन करें, लेकिन ऐसा लगता है जैसे मजदूर केवल "नई" चीजें वापस कर सकते हैं। मैं नहीं देखता कि मैं किसी कार्यकर्ता को कुछ चर और फ़ंक्शन कैसे भेज सकता हूं और फ़ंक्शन में चर को संशोधित कर सकता हूं। उपर्युक्त उदाहरण में, मैं सरणी को एक ही प्रक्रिया पर जीना चाहता हूं और आदर्श रूप से मैं उस सरणी पर कुछ संचालन करने के लिए उस प्रक्रिया को बताने में सक्षम हूं। बाद सभी कार्यों काम पूरा होने पर मैं तो परिणाम आदि लाने सकता

+1

मैं जूलिया में नहीं हूं, लेकिन आप [ZMQ.jl] (https://github.com/JuliaLang/ZMQ.jl) पर एक नज़र डाल सकते हैं और ज़ीरोम –

उत्तर

4

मुझे लगता है कि आप मैक्रो @spawnat के साथ इस हासिल कर सकते हैं:

julia> addprocs(2) 
2-element Array{Int64,1}: 
2 
3 

julia> r = remotecall(2, rand, 2) 
RemoteRef{Channel{Any}}(2,1,3) 

julia> fetch(r) 
2-element Array{Float64,1}: 
0.149753 
0.687653 

julia> remotecall_fetch(2, getindex, r, 1) 
0.14975250913699378 

julia> @spawnat 2 setindex!(fetch(r), 320.0, 1) 
RemoteRef{Channel{Any}}(2,1,6) 

julia> fetch(r) 
2-element Array{Float64,1}: 
320.0 
    0.687653 

julia> @spawnat 2 setindex!(fetch(r), 950.0, 2) 
RemoteRef{Channel{Any}}(2,1,8) 

julia> fetch(r) 
2-element Array{Float64,1}: 
320.0 
950.0 

लेकिन remotecall_fetch के साथ, यह लौटे सरणी की तरह दिखता है वास्तव में एक प्रति है:

julia> remotecall_fetch(2, setindex!, fetch(r), 878.99, 1) 
2-element Array{Float64,1}: 
878.99 
950.0 

julia> remotecall_fetch(2, setindex!, fetch(r), 232.99, 2) 
2-element Array{Float64,1}: 
320.0 
232.99 

julia> fetch(r) 
2-element Array{Float64,1}: 
320.0 
950.0 

साथ: आप Julia Version 0.4.3

-1

फाई सकता है आपकी आवश्यकता के विवरण के आधार पर Distributed Arrays उपयोगी।

+0

के माध्यम से काम वितरित और प्राप्त कर सकते हैं मुझे लगता है कि DArray नहीं है मेरे उद्देश्यों के लिए पर्याप्त लचीला – Lindon

संबंधित मुद्दे