2009-02-19 18 views
31

मुझे एक इंटरैक्टिव एप्लिकेशन में सीपीयू-भारी मल्टीटास्कबल नौकरियों का प्रबंधन करने की आवश्यकता है। पृष्ठभूमि के रूप में, मेरा विशिष्ट अनुप्रयोग एक इंजीनियरिंग डिजाइन इंटरफ़ेस है। चूंकि उपयोगकर्ता किसी मॉडल के लिए अलग-अलग पैरामीटर और विकल्पों को बदलता है, पृष्ठभूमि में एकाधिक सिमुलेशन चलाए जाते हैं और परिणाम पूर्ण होने पर प्रदर्शित होते हैं, भले ही उपयोगकर्ता अभी भी मानों को संपादित कर रहा हो। चूंकि एकाधिक सिमुलेशन परिवर्तनीय समय लेते हैं (कुछ मिलीसेकंड हैं, कुछ 5 सेकंड लेते हैं, कुछ 10 मिनट लेते हैं), यह मूल रूप से जितनी जल्दी हो सके प्रतिक्रिया प्रदर्शित करने का विषय है, लेकिन अक्सर पहले शुरू की गई नौकरियों को निरस्त करना लेकिन अब इसकी आवश्यकता नहीं है उपयोगकर्ता के परिवर्तनों से पहले ही उन्हें अमान्य कर दिया गया है। अलग-अलग उपयोगकर्ता परिवर्तन अलग-अलग कंप्यूटेशंस को अमान्य कर सकते हैं ताकि किसी भी समय मेरे पास 10 अलग-अलग सिमुलेशन चल रहे हों। Somesimulations में कई हिस्सों हैं जिन पर निर्भरता है (सिमुलेशन ए और बी को अलग-अलग गणना की जा सकती है, लेकिन मुझे बीज सिमुलेशन सी के लिए अपने परिणामों की आवश्यकता है इसलिए मुझे ए और बी दोनों को सी शुरू करने से पहले पूरा करने की प्रतीक्षा करनी है।)मल्टीथ्रेडेड जॉब कतार प्रबंधक

मुझे लगता है बहुत आश्वस्त है कि इस तरह के आवेदन को संभालने के लिए कोड-स्तरीय विधि किसी प्रकार की बहुप्रचारित नौकरी कतार है। इसमें निष्पादन के लिए नौकरियां जमा करने, कार्य प्राथमिकताओं को निर्धारित करने, नौकरियों को समाप्त करने की प्रतीक्षा करने, निर्भरताओं को निर्दिष्ट करने, इस नौकरी को करने के लिए, लेकिन केवल नौकरी एक्स और नौकरी वाई समाप्त होने के बाद), कुछ मानदंडों के अनुरूप नौकरियों के सबसेट को रद्द करना, पूछताछ करना शामिल है नौकरियां बनी रहती हैं, कार्यकर्ता थ्रेड की गणना और प्राथमिकताओं को स्थापित करती हैं, और इसी तरह। और मल्टीप्लार्टर समर्थन भी बहुत उपयोगी है।

ये सॉफ़्टवेयर में नए विचार या इच्छा नहीं हैं, लेकिन मैं अपने आवेदन के शुरुआती डिजाइन चरण में हूं जहां मुझे इस तरह के कार्यों के प्रबंधन के लिए लाइब्रेरी का उपयोग करने के बारे में कोई विकल्प बनाना है। मैंने सी में अपने स्वयं के क्रूड थ्रेड प्रबंधकों को सी में लिखा है (मुझे लगता है कि यह पारित होने का संस्कार है) लेकिन मैं अपने काम को आधार देने के लिए आधुनिक उपकरण का उपयोग करना चाहता हूं, न कि अपने पिछले हैक्स।

पहला विचार OpenMP पर चलना है, लेकिन मुझे यकीन नहीं है कि यह वही है जो मैं चाहता हूं। ओपनएमपी ठीक स्तर पर समानांतरता के लिए बहुत अच्छा है, स्वचालित रूप से अनलॉकिंग लूप और ऐसे। मल्टीप्लाफ्फ़्ट के दौरान, यह #pragmas के साथ आपके कोड पर भी हमला करता है। लेकिन ज्यादातर इसे बड़े कार्यों के प्रबंधन के लिए डिज़ाइन नहीं किया गया है .. विशेष रूप से लंबित नौकरियों को रद्द करना या निर्भरताओं को निर्दिष्ट करना। संभव है, हाँ, लेकिन यह सुरुचिपूर्ण नहीं है।

मैंने देखा कि Google Chrome uses such a job manager for even the most trivial tasks. डिज़ाइन लक्ष्य उपयोगकर्ता इंटरैक्शन थ्रेड को जितना संभव हो उतना हल्का और नुकीला रखने के लिए प्रतीत होता है, इसलिए जो कुछ भी अतुल्यकालिक रूप से उत्पन्न हो सकता है, होना चाहिए। क्रोम स्रोत को देखने से यह एक सामान्य पुस्तकालय प्रतीत नहीं होता है, लेकिन यह देखना दिलचस्प है कि डिज़ाइन एसिंक्रोनस लॉन्च का उपयोग कैसे करता है ताकि बातचीत को तेजी से रखा जा सके। यह वही है जो मैं कर रहा हूं।

Surge.Act: नौकरियों को परिभाषित करने के लिए एक बूस्ट की तरह पुस्तकालय:

वहाँ एक अभी भी अन्य विकल्प हैं। यह ओपनएमपी पर बनाता है, लेकिन निर्भरता की श्रृंखला को अनुमति देता है जो अच्छा है। ऐसा लगता है कि ऐसा कोई प्रबंधक नहीं है जिसकी पूछताछ की जा सकती है, नौकरियां रद्द की गई हैं, आदि। यह एक पुरानी परियोजना है इसलिए इस पर निर्भर रहने के लिए डरावना है।

Job Queue जो मैं सोच रहा हूं उसके करीब है, लेकिन यह एक 5 साल का लेख है, समर्थित पुस्तकालय नहीं है।

Boost.threads में अच्छा प्लेटफार्म स्वतंत्र सिंक्रनाइज़ेशन है लेकिन यह नौकरी प्रबंधक नहीं है। POCO में कार्य लॉन्च करने के लिए बहुत साफ डिज़ाइन हैं, लेकिन फिर से चेनिंग कार्यों के लिए पूर्ण प्रबंधक नहीं हैं। (शायद मैं पीओसीओ को कम करके आंका रहा हूं)।

तो विकल्प उपलब्ध होने पर, मैं संतुष्ट नहीं हूं और मुझे फिर से अपनी लाइब्रेरी रोल करने का आग्रह महसूस होता है। लेकिन मैं कुछ ऐसा उपयोग करना चाहता हूं जो अस्तित्व में है।खोज के बाद भी (यहां एसओ और नेट पर) मुझे कुछ भी सही नहीं लगता है, हालांकि मुझे लगता है कि यह एक तरह का टूल होना चाहिए जिसकी अक्सर आवश्यकता होती है, इसलिए निश्चित रूप से कुछ समुदाय पुस्तकालय या कम से कम आम डिजाइन है। SO पर कुछ posts लगभग job queues हैं, लेकिन कुछ भी ऐसा लगता है जो फिट नहीं लगता है।

मेरी पोस्ट यहां आपको सभी मौजूदा उपकरणों से पूछने के लिए है, और/या आपने अपनी खुद की बहु-कार्यरत नौकरी कतार कैसे बनाई है।

उत्तर

5

मैंने बूस्ट.थ्रेड्स के आधार पर अपना खुद का लुत्फ उठाया। मैं बहुत आश्चर्यचकित था कि मुझे इतना छोटा कोड लिखने से कितना धमाका मिला। अगर आपको कुछ पूर्व-निर्मित नहीं मिलता है, तो अपना खुद का रोल करने से डरो मत। Boost.threads और अपने अनुभव के बीच अपने अनुभव लिखने के बाद, यह याद रखना आसान हो सकता है।

प्रीमियर विकल्पों के लिए, यह मत भूलना कि Chromium बहुत दोस्ताना है, इसलिए आप अपने कोड के चारों ओर अपनी जेनेरिक लाइब्रेरी रोल करने में सक्षम हो सकते हैं।

1

boost::future पर एक नजर डालें (लेकिन यह भी इस discussion और proposal देखें) जो (समानांतरवाद के लिए वास्तव में एक अच्छा नींव की तरह दिखता है विशेष रूप से इसके लिए उत्कृष्ट समर्थन प्रदान करते हैं लगता है सी-निर्भर करता है-ऑन-ए-और-बी प्रकार स्थितियों)।

मैंने ओपनएमपी को थोड़ा सा देखा लेकिन (जैसे आप) इस बात से सहमत नहीं थे कि यह फोरट्रान/सी न्यूमेरिक कोड के अलावा कुछ भी अच्छा काम करेगा। इंटेल के Threading Building Blocks मेरे लिए और अधिक दिलचस्प लग रहा था।

यदि इसकी बात आती है, तो बूस्ट :: थ्रेड के शीर्ष पर roll your own पर बहुत मुश्किल नहीं है। [स्पष्टीकरण: एक थ्रेड farm (अधिकांश लोग इसे पूल कहते हैं) फ्रेक्टर (कार्य या नौकरियों) के थ्रेड-सुरक्षित queue से काम खींचता है। उपयोग के उदाहरणों के लिए tests और benchmark देखें। मेरे पास प्राथमिकताओं के साथ (वैकल्पिक रूप से) समर्थन कार्यों के लिए कुछ अतिरिक्त जटिलता है, और जिस मामले में निष्पादन कार्य कार्य कतार में अधिक कार्यों को जन्म दे सकते हैं (इससे यह पता चलता है कि सभी काम वास्तव में थोड़ा और समस्याग्रस्त हो गए हैं; "लंबित" के संदर्भ वे मामले हैं जो मामले से निपट सकते हैं)। हो सकता है कि आप कुछ विचारों को वैसे भी दें।]

+0

बहुत बढ़िया। बढ़ावा :: भविष्य में पीओसीओ के सक्रिय रिजल्ट्स के समान दिखता है (http://pocoproject.org/poco/docs/Poco.ActiveResult.html)। फिर यह एक कार्य कतार प्रबंधक नहीं है, लेकिन फिर भी एक महान उपकरण है। बूस्ट: थ्रेड का आधार कस्टम प्रबंधक बनाने के लिए सबसे कम निम्न स्तर टूलकिट की तरह महसूस करता है। –

3

क्या threadpool आपको कुछ उपयोगी लगेगा? यह बूस्ट :: थ्रेड पर आधारित है और मूल रूप से एक साधारण थ्रेड कार्य कतार लागू करता है जो कार्यकर्ताओं को पूल किए गए धागे से पास करता है।

2

आप Flow-Based Programming पर देख सकते हैं - यह डेटा असंक्रोनस घटकों के बीच स्ट्रीमिंग डेटा पर आधारित है। चालक के जावा और सी # संस्करण हैं, साथ ही कई पूर्ववर्ती घटक भी हैं। यह आंतरिक रूप से बहुप्रचारित है - वास्तव में केवल एकल-थ्रेडेड कोड घटकों के भीतर है, हालांकि आप मानक शेड्यूलिंग नियमों में समय की बाधाओं को जोड़ सकते हैं। यद्यपि यह आपके लिए आवश्यक स्तर के लिए बहुत बढ़िया स्तर पर हो सकता है, यहां कुछ सामान हो सकते हैं जिनका आप उपयोग कर सकते हैं।

0

मुझे नहीं पता कि आप सी ++ लाइब्रेरी (जो मुझे लगता है कि आप हैं) की तलाश में हैं, लेकिन डॉग ली के फोर्क/जावा 7 के लिए फ्रेमवर्क में शामिल होना काफी निफ्टी है, और वही करता है जो आप चाहते हैं। आप शायद इसे C++ में कार्यान्वित करने में सक्षम होंगे या पूर्व-लागू लाइब्रेरी ढूंढेंगे।

अधिक यहाँ जानकारी: http://artisans-serverintellect-com.si-eioswww6.com/default.asp?W1

17

हम (, रोजगार 15-15000ms से चला सकते हैं यूआई धागा हमेशा 33ms के भीतर जवाब चाहिए) वहाँ क्योंकि वास्तव में हमारे अपने काम कतार आपसे मिलते-जुलते आवश्यकताओं को पूरा करने प्रणाली का निर्माण करने, था वहां कुछ भी नहीं था जो हमारी ज़रूरतों को पूरा करता था, अकेले ही प्रदर्शन करने वाला था।

दुर्भाग्य से हमारे कोड मालिकाना हो जाता है के रूप में के बारे में के रूप में स्वामित्व है, लेकिन मैं आपको सबसे प्रमुख विशेषताओं में से कुछ दे सकते हैं:

  • हम कार्यक्रम की शुरुआत में कोर प्रति एक धागा शुरू। प्रत्येक वैश्विक नौकरी कतार से काम खींचता है। जॉब्स में फ़ंक्शन ऑब्जेक्ट और संबंधित डेटा का ग्लोब होता है (वास्तव में func_ptr और शून्य * पर एक विस्तार)। थ्रेड 0, फास्ट क्लाइंट लूप, नौकरियों पर काम करने की अनुमति नहीं है, लेकिन बाकी के रूप में वे पकड़ सकते हैं।
  • नौकरी कतार स्वयं को लॉकलेस डेटा संरचना, जैसे lock-free singly linked list (विजुअल स्टूडियो comes with one) होना चाहिए। एक म्यूटेक्स का उपयोग करने से बचें; कतार के लिए विवाद आश्चर्यजनक रूप से उच्च है, और म्यूटेक्स हथियाने महंगा है।
  • जॉब ऑब्जेक्ट में नौकरी के लिए सभी आवश्यक डेटा पैक करें - नौकरी से मुख्य ढेर में पॉइंटर होने से बचें, जहां आपको नौकरियों और ताले के बीच विवाद से निपटना होगा और अन्य सभी धीमे कष्टप्रद सामान। उदाहरण के लिए, सभी सिमुलेशन पैरामीटर नौकरी के स्थानीय डेटा ब्लॉब में जाना चाहिए। परिणाम संरचना को स्पष्ट रूप से कुछ ऐसा होना चाहिए जो नौकरी से बाहर निकलता है: आप इसे किसी भी द्वारा सौदा कर सकते हैं) नौकरी की वस्तुओं पर चलने के बाद भी लटकते हैं (ताकि आप मुख्य सामग्री से उनकी सामग्री का उपयोग कर सकें), या बी) विशेष रूप से प्रत्येक नौकरी के लिए परिणाम संरचना आवंटित करना और नौकरी के डेटा ऑब्जेक्ट में पॉइंटर भरना। भले ही परिणाम खुद नौकरी में नहीं रहेंगे, यह प्रभावी रूप से नौकरी को अपनी आउटपुट मेमोरी तक विशेष पहुंच प्रदान करता है, इसलिए आपको ताले के साथ मुसब्बर की आवश्यकता नहीं है।

  • असल में मैं थोड़ा ऊपर सरलीकृत कर रहा हूं, क्योंकि हमें कोरियोग्राफ की ज़रूरत है कि कौन सी नौकरियां कोर पर चलती हैं, इसलिए प्रत्येक कोर को अपनी नौकरी कतार मिलती है, लेकिन यह शायद आपके लिए अनावश्यक है।

+0

क्या आप "कोरियोग्राफ को ठीक से बताते हैं कि कौन सी नौकरियां कोर पर चलती हैं, इसलिए प्रत्येक कोर को अपनी नौकरी कतार मिलती है", कारण क्या है, यह प्रोसेसर एफ़िनिटी (https://en.wikipedia.org/wiki) के लिए है/Processor_affinity)? – athos

+1

@athos यह दूसरी तरफ है: प्रोसेसर एफ़िनिटी यह है कि हम कैसे कहते हैं कि कौन सी नौकरी कोर पर चलती है। हमें चीजों को सटीक रूप से कोरियोग्राफ करने की ज़रूरत है ताकि दो रीयलटाइम थ्रेड लगातार अपने कोर पर बिना किसी जोखिम के जोखिम के दौड़ सकें, जबकि अन्य नौकरियां विशिष्ट हार्डवेयर कोर को सौंपी जाती हैं जो कैश इलाके, हाइपरथ्रेडिंग दक्षता इत्यादि को अधिकतम करती हैं। हम इसके लिए विकसित होते हैं एक निश्चित हार्डवेयर प्लेटफार्म तो बहुत कसकर अनुकूलित कर सकते हैं। – Crashworks

1

आप Intel Thread Building Blocks पर देख सकते हैं। मैं इसे वही करता हूं जो आप चाहते हैं और संस्करण 2 के साथ यह ओपन सोर्स है।

4

माइक्रोसॉफ्ट विजुअल स्टूडियो 2010 के अगले संस्करण के लिए प्रौद्योगिकियों के एक सेट पर काम कर रहा है जिसे कंसुरेंसी रनटाइम, समांतर पैटर्न लाइब्रेरी और असिंक्रोनस एजेंट लाइब्रेरी कहा जाता है जो शायद मददगार होगा। कंसुरेंसी रनटाइम पॉलिसी आधारित शेड्यूलिंग प्रदान करेगा, यानी आपको कई शेड्यूलर इंस्टेंस (थ्रेड पूल के समान, लेकिन उदाहरण के बीच भार संतुलन और लोड संतुलन के साथ) का प्रबंधन और रचना करने की इजाजत दी जाएगी, समांतर पैटर्न लाइब्रेरी एक एसटीएल जैसे कार्य आधारित प्रोग्रामिंग और समांतर लूप पेश करेगी प्रोग्रामिंग मॉडल। एजेंट लाइब्रेरी एक अभिनेता आधारित प्रोग्रामिंग मॉडल प्रदान करती है और समवर्ती डेटा प्रवाह पाइपलाइनों के निर्माण के लिए समर्थन करती है, यानी ऊपर वर्णित उन निर्भरताओं का प्रबंधन करना। दुर्भाग्यवश यह अभी तक जारी नहीं हुआ है, इसलिए आप इसके बारे में team blog पर पढ़ सकते हैं या कुछ वीडियो देख सकते हैं on channel9 भी एक बहुत बड़ा सीटीपी है जो डाउनलोड के लिए भी उपलब्ध है।

यदि आप आज समाधान ढूंढ रहे हैं, तो इंटेल के थ्रेड बिल्डिंग ब्लॉक और बूस्ट की थ्रेडिंग लाइब्रेरी दोनों अच्छी पुस्तकालय हैं और अब उपलब्ध हैं। JustSoftwareSolutions ने std :: thread का कार्यान्वयन जारी किया है जो सी ++ 0x ड्राफ्ट से मेल खाता है और निश्चित रूप से ओपनएमपी व्यापक रूप से उपलब्ध है यदि आप ठीक-ठीक लूप आधारित समांतरता को देख रहे हैं।

अन्य लोगों के रूप में असली चुनौती यह है कि समवर्ती निष्पादन (यानी असुरक्षित साझा राज्य) के लिए उपयुक्त कार्यों में सही ढंग से पहचान और विघटन करना है, उनके बीच निर्भरताओं को समझना और बाधाओं पर होने वाली विवाद को कम करना है (चाहे बाधा protecting shared state है या एक कार्य कतार का प्रेषण लूप सुनिश्चित करना कम विवाद या लॉक-फ्री है) ... और अपने शेष कोड में कार्यान्वयन विवरण शेड्यूल किए बिना ऐसा करने के लिए।

-रिक

1

वहां बहुत सारे वितरित संसाधन प्रबंधक हैं। सॉफ्टवेयर जो आपकी सभी आवश्यकताओं को पूरा करता है Sun Grid Engine है। एसजीई दुनिया के कुछ सबसे बड़े सुपरकंप्यूटर पर प्रयोग किया जाता है और सक्रिय विकास में है।

Torque, Platform LSF, और Condor में भी इसी तरह के समाधान हैं।

ऐसा लगता है जैसे आप अपना खुद का रोल करना चाहते हैं लेकिन उपरोक्त सभी में बहुत सारी कार्यक्षमता है।

0

एक छोटी सी पंच शायद करने के लिए देर हो चुकी है, लेकिन थ्रेडवीवर पर भी एक नज़र डालें: http://en.wikipedia.org/wiki/ThreadWeaver

+0

रेपो से लिंक करें: https://projects.kde.org/projects/frameworks/threadweaver/repository – leetNightshade

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