मैं PETSc के साथ खेल रहा था और मैंने देखा कि जब मैं MPI के माध्यम से एक से अधिक प्रक्रियाओं के साथ अपना कार्यक्रम चलाता हूं तो यह और भी धीमी गति से चलने लगता है । मैं कैसे देख सकता हूं कि क्या चल रहा है?
मैं PETSc के साथ खेल रहा था और मैंने देखा कि जब मैं MPI के माध्यम से एक से अधिक प्रक्रियाओं के साथ अपना कार्यक्रम चलाता हूं तो यह और भी धीमी गति से चलने लगता है । मैं कैसे देख सकता हूं कि क्या चल रहा है?
जवाबों:
यह वास्तु कारकों से उत्पन्न हो सकता है:
यदि एक ही मेमोरी बैंडविड्थ एक या अधिक प्रक्रियाओं दोनों के लिए उपलब्ध है, तो आप लगभग कोई स्पीडअप नहीं देखेंगे क्योंकि SpMV और संबंधित रैखिक बीजगणित संचालन मेमोरी बैंडविड्थ सीमित हैं।
यह भी हो सकता है कि संचार ओवरहेड आपको स्थानीय संगणना से अभिभूत कर दे। उदाहरण के लिए, रैखिक पुनरावृत्ति विधियों में हम प्रति प्रक्रिया कम से कम 10,000 अज्ञात होने की सलाह देते हैं।
या संख्यात्मक कारक:
समानांतर प्रीकॉन्डिशनर्स अक्सर अपने सीरियल समकक्षों की तुलना में कमजोर होते हैं। उदाहरण के लिए, ब्लॉक जैकोबी आपके द्वारा उपयोग किए जाने वाले अधिक ब्लॉक को कमजोर कर देता है। इस प्रकार, आपको अतिरिक्त रैखिक पुनरावृत्तियों पर खर्च किए गए अतिरिक्त समय के लिए खाते की आवश्यकता है। सामान्य रूप से नॉनलाइनियर स्थितियां इस तरह से काम नहीं करती हैं, इसलिए न्यूटन पुनरावृत्तियों अक्सर स्थिर होती हैं।
जब भी आप एक कार्यक्रम को समानांतर बनाने की कोशिश कर रहे हैं, तो आपको कई लागतों को संतुलित करना होगा, लेकिन मुख्य रूप से वहाँ है
यदि आपकी गणना शर्मनाक रूप से समानांतर हैं, तो संचार लागत बहुत कम होगी (इनपुट और आउटपुट केवल) और प्रबंधन लागत बहुत कम होनी चाहिए।
यदि आपके पास अभिकलन के बीच अन्योन्याश्रितियाँ हैं, तो संचार लागत काफी बढ़ सकती है। यदि आपके पास एक जटिल एल्गोरिथ्म है जो किसी भी गणना के लिए पूरा करने के लिए अलग-अलग समय लेता है, तो प्रबंधन जटिलता बढ़ जाती है, जैसा कि आप अपने पास मौजूद संसाधनों का कुशलतापूर्वक उपयोग करने का प्रयास करते हैं।
अनुकूलन के किसी भी रूप के साथ, कुंजी बेंचमार्क है। यह देखें कि यह MPI के बिना कैसा प्रदर्शन करता है, यह MPI और एक प्रक्रिया के साथ कैसा प्रदर्शन करता है, फिर इसे कैसे देखें।
यदि आप CUDA के साथ खेल रहे हैं, तो इसे और अधिक डेटा देने का प्रयास करें। यहां एक परीक्षण के परिणामस्वरूप नकारात्मक गति आई। हमने इसे 1000 गुना अधिक डेटा दिया और जीपी-जीपीयू संस्करण लगभग एक ही समय में समाप्त हो गया, जबकि मुख्य सीपीयू पर चलने वाले संस्करण को 1000 गुना लंबा समय लगा।
मैं आपको निम्नलिखित करने की सलाह दूंगा:
समानांतर के साथ और बिना, अपने कोड के समय निष्पादन की एक प्रोफ़ाइल बनाएं। यदि आपको यह करने में संदेह है कि आप अपने कोड का बेहतर वर्णन करते हैं, तो हम आपकी मदद कर सकते हैं।
अब आप उन हिस्सों पर ध्यान केंद्रित कर सकते हैं जो समानांतर में धीमी गति से चलते हैं। आपको पता होना चाहिए कि प्रक्रियाओं के बीच संचार धीमा हो सकता है। जैसे मार्क और सीन ने बताया, सिर्फ इसलिए कि किसी समस्या को थ्रेड में विभाजित किया जा सकता है, इसका मतलब यह नहीं है कि ऐसा करना कुशल होगा। आपको इसे और गहराई से देखना होगा। लेकिन अगर आप अपना कोड प्रोफाइल करते हैं, तो यह आपको किसी भी मौजूदा बग को खोजने में मदद कर सकता है। मेरे दो सेंट।
यदि आप समझाते हैं कि आप और अधिक विस्तार से क्या कर रहे हैं, उदाहरण के लिए एक वर्कफ़्लो के साथ, कोई आपको बेहतर स्पष्टीकरण देने में सक्षम हो सकता है।