2012-03-13 15 views
8

में समानांतर डेटा संग्रह सूची, सरणी या seq में से कौन सा समानांतर प्रसंस्करण के लिए अधिक कुशल हैं और आसानी से इस तरह के parmap, parfilter, आदि के रूप में समानांतर आपरेशन लागू कर सकते हैं?एफ #

संपादित करें: सुझावों के लिए धन्यवाद। Array.Parallel एक अच्छा विकल्प की तरह दिखता है। PSeq.fs को भी चेक आउट किया गया है और मुझे इस सवाल के बारे में एक प्रश्न है कि pmap काम के नीचे कैसे है।

let pmap f xs = 
    seq { for x in xs -> async { return f xs } } 
    |> Async.Parallel 
    |> Async.RunSynchronously 

अनुक्रम में प्रत्येक तत्व के लिए एक नया धागा उत्पन्न होता है? यदि हां, तो क्या सीक को टुकड़ों में तोड़ने और समानांतर में मूल्यांकन करने के लिए प्रत्येक खंड के लिए एक नया कार्य बनाने का कोई तरीका है?

मैं यह भी देखना चाहूंगा कि सूची के लिए कोई समान pmap कार्यान्वयन है या नहीं। मैंने पाया कि टॉमस के पास कार्यान्वयन उनके ब्लॉग पोस्ट here में है। लेकिन मुझे यकीन नहीं है कि समांतर मूल्यांकन करने के लिए सूची में सरणी को परिवर्तित करने से बहुत अधिक ओवरहेड नहीं होता है और यदि इससे बचा जा सकता है?

संपादित करें: अपने सभी आदानों के लिए धन्यवाद। टॉमस ने मेरे मूल प्रश्न का उत्तर दिया।

पहले संपादन में मेरे अपने प्रश्न का उत्तर देना:

मैं तोड़ने टुकड़ों में एक बड़ी सूची तो प्रत्येक sublist को async लागू करने की कोशिश की।

let pmapchunk f xs = 
    let chunks = chunk chunksize xs 
    seq { for chunk in chunks -> async { return (Seq.map f) chunk } } 
    |> Async.Parallel 
    |> Async.RunSynchronously 
    |> Seq.concat 

परिणाम: map: 15s, pmap: 7s, pmapchunk: 10s।

+1

यह निर्भर करता है, लेकिन आप लगभग निश्चित रूप से 'चाहते Array.Parallel' और नहीं' async'। –

उत्तर

9

एफ # पुस्तकालय में कुछ सरणी के संचालन के लिए एक समानांतर कार्यान्वयन नहीं है हो सकता है की प्रवृत्ति नहीं होती। आम तौर पर, यदि एरे के साथ काम करना लंबे समय तक होता है तो सरणी के साथ काम करना सबसे अधिक कुशल होता जा रहा है।

  • Array.Parallel मॉड्यूल पर एक नज़र डालें। इसमें तत्वों (map) और choose फ़ंक्शन के साथ गणना करने के लिए सरणी (init) बनाने के लिए फ़ंक्शन शामिल हैं जिनका उपयोग फ़िल्टरिंग को लागू करने के लिए किया जा सकता है।

आप कार्य है कि काफी सरल कर रहे हैं की एक जटिल पाइपलाइन लिख रहे हैं, लेकिन उनमें से एक बड़ी संख्या है, तो आप PLINQ है, जो पूरे पाइप लाइन के रूप में सिर्फ parallelizing करने का विरोध किया parallelizes का उपयोग करना होगा व्यक्तिगत संचालन (मानचित्र की तरह)।

  • एक एफ # अनुकूल आवरण के लिए F# PowerPack से PSeq मॉड्यूल पर एक नजर डालें - यह pseq<'T> प्रकार और उनके साथ काम करने के लिए हमेशा की तरह काम करता है परिभाषित करता है। यह blog post में कुछ उपयोगी जानकारी भी शामिल है।
+0

धन्यवाद। मैं आपके ब्लॉग पर 'ऐरे। पैरालेल', 'पीएसईक्यू' और 'समानांतर सूची' में आया था। पिछले दो पुस्तकालय संदर्भ में शामिल नहीं प्रतीत होते हैं, केवल 'ऐरे। पैरालेल' करता है। मैंने सवाल संपादित कर लिया है, कृपया एक नज़र डालें। – vis

+1

"एरे के साथ काम करना संभवतः सबसे प्रभावी होने वाला है यदि व्यक्तिगत संचालन लंबे समय तक लेते हैं"? मैं उम्मीद करता हूं कि अलग-अलग ऑपरेशन त्वरित होने पर सरणी अपेक्षाकृत तेज हो जाएंगी। –

0

असल में, स्विचिंग संग्रह प्रकारों का ओवरहेड एसिंक ऑपरेशन करने की लागत की तुलना में छोटा है, इसलिए संग्रह प्रकार कोई फर्क नहीं पड़ता।

कहा करने के बाद कि, List एफ # वाक्य रचना के साथ और अधिक अच्छी तरह से जाल को तो यह सबसे अच्छा

+4

'सूची' समांतर प्रोग्रामिंग के लिए सबसे खराब संभव संग्रह प्रकार है क्योंकि यह शर्मनाक अनुक्रमिक है। –

1

टॉमस 'सुझाव Array.Parallel को देखने के लिए के साथ, यह ध्यान देने योग्य है कि सरणियों (और सरणी समर्थित संग्रह) हमेशा पार करने के लिए (नक्शा, आईटीईआर, ...), क्योंकि वे संग्रह किए गए हैं सबसे कारगर होगा संगत स्मृति में।