क्यों अवरुद्ध कर रहा है, मैं एक टेस्ला टी 10 प्रोसेसर (गणना क्षमता 1.3) से एक टेस्ला एम 2075 (गणना क्षमता 2.0) में लिखे गए एल्गोरिदम को स्विच करने का प्रयास कर रहा हूं। स्विचिंग करते समय मुझे आश्चर्य हुआ कि मेरा एल्गोरिदम धीमा हो गया है। मैंने इसका विश्लेषण किया और पाया कि ऐसा लगता है क्योंकि नई मशीन पर कूडा धाराएं अवरुद्ध हो रही हैं। मेरे एल्गोरिदम में 3 मुख्य कार्य होते हैं जिन्हें विभाजित और समानांतर में चलाया जा सकता है: स्मृति पुनर्गठन (जो सीपीयू पर किया जा सकता है), मेजबान से डिवाइस पर प्रतिलिपि बनाने की स्मृति, और डिवाइस पर कर्नेल निष्पादन। जब तक पिछले गिरी किया जाता है यह निर्धारित करने के लिए कि एक CUDA स्ट्रीम
नई मशीन पर धाराओं ब्लॉक सीपीयू गणना शुरू करने से पहले हालांकि: पुराने मशीन बंटवारे पर धाराओं 3 कार्य इस तरह (NVIDIA दृश्य प्रोफाइलर से सभी स्क्रीनशॉट) ओवरलैप करने की अनुमति दी , को क्रियान्वित करने के रूप में यहां देखा जा सकता:
आप शीर्ष पंक्ति को देख सकते हैं, सभी नारंगी ब्लॉक cudaStreamSynchronize जो ब्लॉक जब तक पिछले गिरी निष्पादन किया जाता है, भले ही उस गिरी एक पूरी तरह से अलग धारा पर कॉल कर रहे हैं। ऐसा लगता है कि धाराओं के माध्यम से पहले भाग के लिए काम करना और सही ढंग से समानांतरता है, लेकिन उसके बाद समस्या शुरू होती है, इसलिए मैंने सोचा कि शायद यह किसी चीज़ पर अवरुद्ध हो रहा है और मैंने धाराओं की संख्या बढ़ाने की कोशिश की जिसने मुझे यह परिणाम दिया:
यहां आप देख सकते हैं कि किसी कारण से केवल पहली 4 धाराएं अवरुद्ध हो रही हैं, इसके बाद यह ठीक से समानांतर शुरू हो जाती है। आखिरी प्रयास के रूप में मैंने केवल चार बार केवल पहली बार स्ट्रीम का उपयोग करके और फिर बाद की धाराओं का उपयोग करने के लिए स्विच करके इसे चारों ओर घूमने की कोशिश की, लेकिन यह अभी भी काम नहीं कर रहा है और यह अभी भी प्रत्येक 4 धाराओं को रोकता है जबकि अन्य धाराओं को समवर्ती रूप से निष्पादित करते हैं :
तो मैं इस समस्या का कारण बनने और इसका निदान कैसे कर सकता हूं, इस बारे में कोई विचार ढूंढ रहा हूं। मैंने अपने कोड पर ध्यान दिया है और मुझे नहीं लगता कि यह एक बग है, हालांकि मुझे गलत लगाया जा सकता है। प्रत्येक स्ट्रीम अपनी कक्षा में encapsulated है और केवल एक cudaStream_t का संदर्भ है जो उस वर्ग का सदस्य है, इसलिए मुझे नहीं लगता कि यह एक और धारा का संदर्भ कैसे दे सकता है और उस पर अवरुद्ध कर सकता है।
क्या संस्करण 1.3 और 2.0 के बीच धाराओं के काम में कुछ बदलाव हैं जो मुझे पता नहीं है? क्या यह साझा स्मृति के साथ कुछ हो सकता है जिसे मुक्त नहीं किया जा रहा है और इसे उस पर इंतजार करना है? इस समस्या का निदान करने के लिए कोई विचार स्वागत है, धन्यवाद।
मुझे आश्चर्य है कि आपकी समस्या हाल ही में एनवीआईडीआईए मंचों में निम्नलिखित धागे में चर्चा की गई थी: https: //devtalk.nvidia।कॉम/डिफ़ॉल्ट/विषय/545476/क्यूडा-प्रोग्रामिंग-और-प्रदर्शन/कूडा-स्ट्रीम-प्रदर्शन/प्रोफाइलर को 'conckerneltrace' विकल्प को जोड़ने के लिए समाधान था। – njuffa
विंडोज या लिनक्स? आप प्रत्येक मामले में किस ड्राइवर संस्करण का उपयोग कर रहे हैं? आपके कर्नल के लिए लॉन्च पैरामीटर क्या हैं? क्या आप किसी प्रकार का पुनरुत्पादक पोस्ट कर सकते हैं? –
एनवीआईडीआईए विजुअल प्रोफाइलर (सीयूडीए 5.0 और 5.5) में, 'समवर्ती कर्नेल प्रोफाइलिंग सक्षम करें' विकल्प भी है। मुझे लगता है कि यह सीएलआई विकल्प 'conckerneltrace' के समान परिणाम प्राप्त करता है। ध्यान दें कि इसके लिए आपको एक सीसी> = 2.0 डिवाइस चाहिए। – BenC