मेरे अनुक्रमिक सॉल्वर की तुलना में मेरा समानांतर सॉल्वर क्यों धीमा है?


14

मैं PETSc के साथ खेल रहा था और मैंने देखा कि जब मैं MPI के माध्यम से एक से अधिक प्रक्रियाओं के साथ अपना कार्यक्रम चलाता हूं तो यह और भी धीमी गति से चलने लगता है । मैं कैसे देख सकता हूं कि क्या चल रहा है?


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

जवाबों:


13

यह वास्तु कारकों से उत्पन्न हो सकता है:

यदि एक ही मेमोरी बैंडविड्थ एक या अधिक प्रक्रियाओं दोनों के लिए उपलब्ध है, तो आप लगभग कोई स्पीडअप नहीं देखेंगे क्योंकि SpMV और संबंधित रैखिक बीजगणित संचालन मेमोरी बैंडविड्थ सीमित हैं।

यह भी हो सकता है कि संचार ओवरहेड आपको स्थानीय संगणना से अभिभूत कर दे। उदाहरण के लिए, रैखिक पुनरावृत्ति विधियों में हम प्रति प्रक्रिया कम से कम 10,000 अज्ञात होने की सलाह देते हैं।

या संख्यात्मक कारक:

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


8

जब भी आप एक कार्यक्रम को समानांतर बनाने की कोशिश कर रहे हैं, तो आपको कई लागतों को संतुलित करना होगा, लेकिन मुख्य रूप से वहाँ है

  • प्रत्येक संगणना को चलाने की लागत
  • उन अभिकलन के बीच किसी भी संचार की लागत
  • उन संगणनाओं के प्रबंधन की लागत

यदि आपकी गणना शर्मनाक रूप से समानांतर हैं, तो संचार लागत बहुत कम होगी (इनपुट और आउटपुट केवल) और प्रबंधन लागत बहुत कम होनी चाहिए।

यदि आपके पास अभिकलन के बीच अन्योन्याश्रितियाँ हैं, तो संचार लागत काफी बढ़ सकती है। यदि आपके पास एक जटिल एल्गोरिथ्म है जो किसी भी गणना के लिए पूरा करने के लिए अलग-अलग समय लेता है, तो प्रबंधन जटिलता बढ़ जाती है, जैसा कि आप अपने पास मौजूद संसाधनों का कुशलतापूर्वक उपयोग करने का प्रयास करते हैं।

अनुकूलन के किसी भी रूप के साथ, कुंजी बेंचमार्क है। यह देखें कि यह MPI के बिना कैसा प्रदर्शन करता है, यह MPI और एक प्रक्रिया के साथ कैसा प्रदर्शन करता है, फिर इसे कैसे देखें।

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


3

मैं आपको निम्नलिखित करने की सलाह दूंगा:

  • समानांतर के साथ और बिना, अपने कोड के समय निष्पादन की एक प्रोफ़ाइल बनाएं। यदि आपको यह करने में संदेह है कि आप अपने कोड का बेहतर वर्णन करते हैं, तो हम आपकी मदद कर सकते हैं।

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

यदि आप समझाते हैं कि आप और अधिक विस्तार से क्या कर रहे हैं, उदाहरण के लिए एक वर्कफ़्लो के साथ, कोई आपको बेहतर स्पष्टीकरण देने में सक्षम हो सकता है।


@केत: आप सही कह रहे हैं। क्षमा करें और ध्यान देने के लिए धन्यवाद। पाठ को संपादित किया।
jbcolmenares 15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.