2011-03-28 2 views
5

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

./program1 & 
./program2 & 
./program3 & 
./program4 

जो स्वाभाविक रूप से एक अलग प्रोसेसर पर प्रत्येक धारावाहिक कार्यक्रम चलाएगा। यह एक लॉगिन सर्वर या स्टैंडअलोन वर्कस्टेशन पर अच्छी तरह से काम करता है, और निश्चित रूप से बैच नौकरी के लिए केवल एक नोड मांगना।

लेकिन अगर मुझे 110 अलग-अलग डेटा सेट पढ़ने के लिए उसी कार्यक्रम के 110 अलग-अलग उदाहरण चलाने की आवश्यकता है तो क्या होगा? यदि मैं एक स्क्रिप्ट के साथ एकाधिक नोड्स (14 कहता हूं) सबमिट करता हूं जो 110./program# कमांड प्रस्तुत करता है, तो बैच सिस्टम अलग-अलग नोड्स पर एक अलग प्रोसेसर पर प्रत्येक नौकरी चलाएगा, या क्या यह उन सभी को चलाने की कोशिश करेगा, 8 कोर नोड?

मैंने अलग-अलग डेटा पढ़ने के लिए एक साधारण एमपीआई कोड का उपयोग करने का प्रयास किया है, लेकिन विभिन्न त्रुटियों के परिणामस्वरूप, 110 प्रक्रियाओं में से लगभग 100 में से सफल होने के साथ-साथ अन्य क्रैश हो रहे हैं। मैंने नौकरी के सरणी भी मानी हैं, लेकिन मुझे यकीन नहीं है कि मेरा सिस्टम इसका समर्थन करता है या नहीं।

मैंने व्यक्तिगत डेटा सेट पर सीरियल प्रोग्राम का व्यापक रूप से परीक्षण किया है - कोई रनटाइम त्रुटियां नहीं हैं, और मैं प्रत्येक नोड पर उपलब्ध स्मृति से अधिक नहीं हूं।

उत्तर

5

नहीं, पीबीएस स्वचालित रूप से आपके लिए नोड्स के बीच नौकरियों को वितरित नहीं करेगा। लेकिन यह करना एक आम बात है, और आपके पास कुछ विकल्प हैं।

  • सबसे आसान और कुछ मायनों आप के लिए सबसे advantagous में 1 नोड आकार टुकड़ों में कार्य गुच्छा है, और व्यक्तिगत नौकरियों के रूप में उन बंडलों सबमिट करें। यह आपकी नौकरियों को तेजी से शुरू कर देगा; एक 1-नोड नौकरी आमतौर पर 14 नोड नौकरी की तुलना में तेज़ी से निर्धारित की जाएगी, क्योंकि 14 से अधिक समय में एक-नोड आकार के छेद हैं। यह विशेष रूप से अच्छी तरह से काम करता है यदि सभी नौकरियां लगभग समान समय लेती हैं, क्योंकि तब विभाजन करना बहुत आसान है।

  • यदि आप इसे एक नौकरी में करना चाहते हैं (कहें, बहीखाता को सरल बनाने के लिए), तो आप pbsdsh कमांड तक पहुंच सकते हैं या नहीं; here की अच्छी चर्चा है। यह आपको अपने काम में सभी प्रोसेसर पर एक ही स्क्रिप्ट चलाने देता है। फिर आप एक स्क्रिप्ट लिखते हैं जो $ PBS_VNODENUM से पूछता है कि यह पता लगाने के लिए कि कौन सी नोड्स * पीपीएन नौकरियां हैं, और उचित कार्य चलाती हैं।

  • यदि नहीं pbsdsh, Gnu parallel एक और उपकरण है जो इन कार्यों को बहुत सरल बना सकता है। यह xargs की तरह है, यदि आप उससे परिचित हैं, लेकिन एकाधिक नोड्स सहित समांतर में कमांड चलाएंगे। तो आप अपनी (कहें) 14-नोड नौकरी जमा करेंगे और पहला नोड एक gnu समानांतर स्क्रिप्ट चलाएगा। अच्छी बात यह है कि यह आपके लिए शेड्यूलिंग करेगा, भले ही नौकरियां एक ही लंबाई में न हों। इस तरह के चीजों के लिए gnu समानांतर का उपयोग करने के लिए हम अपने सिस्टम पर उपयोगकर्ताओं को सलाह देते हैं here। ध्यान दें कि यदि आपके सिस्टम पर gnu समानांतर स्थापित नहीं है, और किसी कारण से आपके sysadmins ऐसा नहीं करेंगे, तो आप इसे अपने होम निर्देशिका में सेट कर सकते हैं, यह एक जटिल निर्माण नहीं है।

+0

बहुत बहुत धन्यवाद, अब मैं आपके कुछ सुझावों को लागू कर रहा हूं। जीएनयू समानांतर के लिए –

+0

+1 - एक अद्भुत उपकरण। – Owen

2

आपको job arrays पर विचार करना चाहिए।

संक्षेप में, आप अपने खोल स्क्रिप्ट में #PBS -t 0-109 सम्मिलित (जहां सीमा 0-109 किसी भी पूर्णांक रेंज आप चाहते हो सकता है, लेकिन आप ने कहा आप 110 डेटासेट थी) और टोक़ करेंगे:

  • रन अपनी स्क्रिप्ट की 110 उदाहरणों आपके द्वारा निर्दिष्ट संसाधनों के साथ प्रत्येक आवंटित (#PBS टैग के साथ स्क्रिप्ट में या सबमिट करते समय तर्क के रूप में)।
  • प्रत्येक नौकरी के लिए पर्यावरण परिवर्तनीय PBS_ARRAYID पर 0 से 109 तक एक अद्वितीय पूर्णांक असाइन करें।

मान लें कि आपके पास कोड के भीतर पर्यावरण चरों तक पहुंच है, आप केवल प्रत्येक नौकरी को डेटा सेट नंबर PBS_ARRAYID पर चलाने के लिए बता सकते हैं।

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