2012-03-13 9 views
5

8 कोर के साथ एक मशीन को मानना। हास्केल में, आप threaded विकल्प का उपयोग करके संकलित कर सकते हैं, फिर रनटाइम के दौरान उपयोग किए जाने वाले कोर की संख्या निर्दिष्ट करने के लिए +RTS -Nx का उपयोग करें। जैसेस्पीडअप प्राप्त करने के लिए एफ # माप कैसे लें

$ myprg args // sequential run 
$ myprg args +RTS -N1 // parallel run on 1..8 cores 
$ myprg args +RTS -N2 
$ myprg args +RTS -N4 
$ myprg args +RTS -N8 

इस से, आप कोर, जिसे फिर आप speedups प्राप्त करने के लिए इस्तेमाल करते हैं और एक ग्राफ प्लॉट कर सकते हैं की बढ़ती संख्या का उपयोग कर runtimes मिलता है।

आप एफ # में यह कैसे करेंगे, मान लें कि मेरे पास समानांतर प्रोग्राम है। कोड में समानांतर मानचित्र का उपयोग कर?

संपादित करें: मैंने पाया ParallelOptions जैसे देखते हैं MaxDegreeOfParallelism जो हो सकता है जो मुझे चाहिए लेकिन इसके सटीक व्यवहार के बारे में निश्चित नहीं है, और मुझे इसे प्रोग्रामेटिक रूप से उपयोग करना होगा, जब तक यह अपेक्षित व्यवहार करता है यानी MaxDegreeOfParallelism = कोर प्रोग्राम के num का उपयोग करना चाहिए, और समांतर 'कार्य नहीं करना चाहिए 'या धागे।

संपादित करें: ProcessorAffinity वास्तव में कोर का उपयोग करने की संख्या को सीमित लेकिन ऐसा लगता है कि यह ठीक से मोनो में लागू नहीं है। मैंने विंडोज़ पर जांच की और ऐसा लगता है कि यह काम करता है। हालांकि यह वास्तव में उपयोग करने के लिए एक अच्छा विचार नहीं है। रनटाइम सिस्टम बेहतर निर्णय लेने में सक्षम होना चाहिए कि कार्य कैसे प्रबंधित करें और शेड्यूल करें। इसके अलावा, MaxDegreeOfParallelism "समांतरता स्तर" के बारे में है जो मूल रूप से उत्पन्न कार्यों की संख्या निर्धारित करता है, इस प्रकार ग्रैनुलरिटी को बदलने के लिए उपयोग किया जा सकता है।

+2

यदि आप विंडोज का उपयोग कर रहे हैं, तो आप केवल एक कार्य प्रबंधक में सीपीयू की संख्या निर्धारित कर सकते हैं: http://www.addictivetips.com/windows-tips/how-to-set-processor-affinity-to-an -प्लिकेशंस-इन-विंडोज/ –

+0

मैं लिनक्स/मोनो का उपयोग कर रहा हूं। क्या लिनक्स के तहत एक ही काम करने का कोई तरीका है? – vis

+6

एफ # एक मूल .NET असेंबली बनाता है। एक असेंबली रनटाइम (सीएलआर) के लिए निर्दिष्ट नियमों का पालन करती है जो डिफ़ॉल्ट रूप से सभी सीपीयू कोर पर संबंध रखते हैं। आप 'System.Diagnostics.Process.GetCurrentProcess() प्रोसेसरएफ़िनिटी 'सेट करके कोर के _fewer_ संख्या के लिए सीएलआर को सीमित कर सकते हैं। – bytebuster

उत्तर

2

एफ # एक देशी नेट विधानसभा बनाता है (यदि आप एक जवाब एक टिप्पणी छोड़ दो और मैं इस को नष्ट करेगा जोड़ते हैं)। एक असेंबली रनटाइम (सीएलआर) के लिए निर्दिष्ट नियमों का पालन करती है जो डिफ़ॉल्ट रूप से सभी सीपीयू कोर पर संबंध रखते हैं। System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity सेट करके आप कम कोर के लिए सीएलआर को सीमित कर सकते हैं।

यह उत्तर मोनो पर्यावरण के लिए अधूरा प्रतीत होता है। ProcessorAffinity मूल्य is a bit mask, इसलिए 0 निश्चित रूप से एक अवैध स्थिति है। मैं यह भी सोच रहा हूं कि क्यों एमएसडीएन में वर्णित एक सेटर ने अपवाद नहीं फेंक दिया।

मैं मोनो एफ़िनिटी की जांच करने के लिए schedutils का उपयोग करता हूं और यह भी जांचता हूं कि MONO_NO_SMP पर्यावरण ध्वज सेट नहीं है या नहीं।

2

bytebuster की टिप्पणी के शब्दों में:

एफ # एक देशी नेट विधानसभा बनाता है। एक असेंबली रनटाइम (सीएलआर) के लिए निर्दिष्ट नियमों का पालन करती है जो डिफ़ॉल्ट रूप से सभी सीपीयू कोर पर संबंध रखते हैं। System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity सेट करके आप कम संख्या में कोर के लिए सीएलआर सीमित कर सकते हैं।

+0

आपको शायद एक समुदाय विकी के रूप में उत्तर चिह्नित करना चाहिए (यदि आप मूल लेखक नहीं हैं)। –

+0

@TomasPetricek: संपन्न – Guvante

+0

मैंने 'प्रोसेसरएफ़िनिटी 'का उपयोग करने की कोशिश की लेकिन 8 कोर के साथ मशीन पर समानांतर प्रोग्राम चलाने पर ऐसा कोई फर्क नहीं पड़ता। मैं उम्मीद करता हूं कि एफ़िनिटी को 1,2,4,8 तक सेट करने से स्पीडअप बढ़ेगा लेकिन ऐसा नहीं है। रनटाइम वही रहते हैं, जैसे कि इस संपत्ति को सेट करने से कोई फर्क नहीं पड़ता है। ऐसा कोई कारण क्यों हो रहा है? एमएसडीएन में डॉक्टर को देखने के बाद, मुझे लगता है कि यह भौतिक प्रोसेसर पर लागू होता है और प्रोसेसर कोर नहीं। – vis

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