2013-02-15 48 views
10

में सीयूडीए कर्नेल लॉन्च करने वाली कई प्रक्रियाएं मुझे पता है कि गणना क्षमता 2.x या इससे अधिक के साथ एनवीआईडीआईए जीपीयस आपको 16 कर्नेल के साथ एक साथ निष्पादित कर सकता है। हालांकि, मेरा आवेदन 7 "प्रक्रियाओं" उत्पन्न करता है और इनमें से प्रत्येक प्रक्रिया में CUDA कर्नेल लॉन्च होते हैं।समांतर

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

मैं उलझन में हूँ क्योंकि CUDA सी प्रोग्रामिंग गाइड कहते हैं: "। एक CUDA संदर्भ से एक गिरी एक और CUDA संदर्भ से एक कर्नेल के साथ समवर्ती पर अमल नहीं कर सकते"

यह मुझे मेरे दूसरे प्रश्न पर लाता है, सीयूडीए "संदर्भ" क्या हैं?

धन्यवाद!

उत्तर

14

एक CUDA संदर्भ एक वर्चुअल निष्पादन स्थान है जिसमें होस्ट थ्रेड या प्रक्रिया के स्वामित्व वाले कोड और डेटा होते हैं। सभी मौजूदा हार्डवेयर के साथ जीपीयू पर केवल एक संदर्भ सक्रिय हो सकता है।

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

आप एक जीपीयू संदर्भ धारण करने वाले एकल कार्यकर्ता धागे को लॉन्च करना और GPU पर काम को धक्का देने के लिए अन्य धागे से संदेश का उपयोग करना बेहतर होगा। वैकल्पिक रूप से CUDA ड्राइवर API में एक संदर्भ माइग्रेशन सुविधा उपलब्ध है, लेकिन यह केवल उसी प्रक्रिया से धागे के साथ काम करेगी, और माइग्रेशन तंत्र में विलंबता और मेजबान CPU ओवरहेड है।

0

क्या आपको वास्तव में अलग-अलग धागे और संदर्भ होने की आवश्यकता है? मेरा मानना ​​है कि सर्वोत्तम अभ्यास एक GPU प्रति उपयोग एक संदर्भ है, क्योंकि एकल GPU पर कई संदर्भ पर्याप्त ओवरहेड लाते हैं।

कई कर्नल concrurrenlty निष्पादित करने के लिए आपको एक CUDA संदर्भ में कुछ CUDA धाराएं बनाना चाहिए और प्रत्येक कर्नेल को अपनी स्ट्रीम में कतारबद्ध करना चाहिए - इसलिए इसके लिए पर्याप्त संसाधन होने पर उन्हें समवर्ती रूप से निष्पादित किया जाएगा।

यदि आपको कुछ CPU थ्रेड्स से संदर्भ को सुलभ बनाने की आवश्यकता है - तो आप उन्हें पास करने के लिए cuCtxPopCurrent(), cuCtxPushCurrent() का उपयोग कर सकते हैं, लेकिन केवल एक थ्रेड किसी भी समय संदर्भ के साथ काम करने में सक्षम होगा।

+0

क्या आप कृपया पुष्टि करेंगे कि एकाधिक संदर्भ एक जीपीयू पर एक साथ सक्रिय हो सकते हैं? – Tariq

+0

@ तारिक, मैंने यह नहीं बताया कि) मैं पुष्टि कर सकता हूं कि आप एक ही समय में एक जीपीयू पर दो संदर्भों के साथ दो प्रोग्राम चला सकते हैं, लेकिन मुझे पता नहीं है कि वे दोनों सक्रिय होंगे या ड्राइवर वैकल्पिक वर्कफ़्लो किसी भी तरह से करेगा। – ShPavel

+0

http://stackoverflow.com/questions/31643570/running-more-than-one-cuda-applications-on-one-gpu – pgoetz