मेरे पास एक ऐसा एप्लिकेशन है जहां मैंने उपयोगकर्ता के सिस्टम पर GPUs के बीच प्रोसेसिंग लोड को विभाजित किया। असल में, प्रति GPU प्रति CPU थ्रेड है जो मुख्य अनुप्रयोग थ्रेड द्वारा समय-समय पर ट्रिगर होने पर GPU प्रसंस्करण अंतराल शुरू करता है।2 GPUs के साथ cudaMalloc को कॉल करते समय खराब प्रदर्शन
GPU प्रसंस्करण अंतराल के उदाहरण के लिए निम्न छवि (एनवीआईडीआईए के CUDA प्रोफाइलर टूल का उपयोग करके उत्पन्न) पर विचार करें - यहां एप्लिकेशन एक एकल GPU का उपयोग कर रहा है।
आप देख सकते हैं GPU प्रसंस्करण समय के एक बड़े हिस्से दो छँटाई संचालन द्वारा उपयोग किया जाता है और मैं इस (जोर :: sort_by_key) के लिए थ्रस्ट लाइब्रेरी का उपयोग कर रहा हूँ। साथ ही, यह जोर देता है जैसे :: sort_by_key वास्तविक प्रकार शुरू करने से पहले हुड के नीचे कुछ cudaMallocs को कॉल करता है।
अब एक ही प्रसंस्करण अंतराल जहां आवेदन दो GPUs से अधिक संसाधन लोड फैल गया है पर विचार करें:
एक आदर्श दुनिया में आप 2 GPU प्रसंस्करण अंतराल बिल्कुल आधे की है कि होने की अपेक्षा करेंगे एकल जीपीयू (क्योंकि प्रत्येक जीपीयू आधा काम कर रहा है)। जैसा कि आप देख सकते हैं, यह मामला आंशिक रूप से नहीं है क्योंकि कुछ प्रकार के विवाद मुद्दे के कारण cudaMallocs को एक साथ (कभी-कभी 2-3 गुना अधिक) कहा जाता है। मुझे नहीं पता कि यह मामला क्यों होना चाहिए क्योंकि 2 जीपीयू के लिए मेमोरी आवंटन स्थान पूरी तरह से स्वतंत्र है इसलिए cudaMalloc पर सिस्टम-व्यापी लॉक नहीं होना चाहिए - एक प्रति-जीपीयू लॉक अधिक उचित होगा।
मेरी परिकल्पना साबित करने के लिए कि इस मुद्दे को एक साथ cudaMalloc कॉल के साथ है, मैं दो सीपीयू धागे (प्रत्येक GPU के लिए) प्रत्येक बुला cudaMalloc कई बार के साथ एक हास्यास्पद साधारण प्रोग्राम बनाया। मैं पहली बार इस कार्यक्रम के भाग गया ताकि अलग धागे एक ही समय में cudaMalloc कॉल नहीं करते: ~
आप इसे लेता है देखने के आवंटन प्रति 175 माइक्रोसेकंड। इसके बाद, मैं धागे एक साथ cudaMalloc बुला के साथ कार्यक्रम भागा:
यहाँ, प्रत्येक कॉल ~ 538 माइक्रोसेकंड या पिछले मामले से अधिक समय के लिए 3 बार ले लिया! कहने की जरूरत नहीं है, यह मेरे आवेदन को काफी धीमा कर रहा है और यह कारण है कि इस मुद्दे को 2 जीपीयू से अधिक खराब हो जाएगा।
मैंने लिनक्स और विंडोज पर इस व्यवहार को देखा है। लिनक्स पर, मैं एनवीडिया ड्राइवर संस्करण 319.60 का उपयोग कर रहा हूं और विंडोज़ पर मैं 327.23 संस्करण का उपयोग कर रहा हूं। मैं CUDA टूलकिट 5.5 का उपयोग कर रहा हूँ।
संभावित कारण: मैं इन परीक्षणों में जीटीएक्स 6 9 0 का उपयोग कर रहा हूं। यह कार्ड मूल रूप से एक ही इकाई में 2 जी 80-जैसी जीपीयू है। यह एकमात्र "बहु-जीपीयू" सेटअप है जिसे मैंने चलाया है, तो शायद 6 9 0 के 2 जीपीयू के बीच कुछ हार्डवेयर निर्भरता के साथ cudaMalloc समस्या का कुछ संबंध है?
उच्च प्रदर्शन कोड के लिए सामान्य अनुशंसा किसी भी प्रदर्शन लूप से मॉलोक ऑपरेशंस प्राप्त करना है। मुझे एहसास है कि यह एक मामूली मामला नहीं है क्योंकि आप जोर दे रहे हैं।उच्च प्रदर्शन सॉर्ट लाइब्रेरीज़ हैं जो जोर से sort_by_key को प्रतिस्थापित कर सकती हैं जो आपको समय से पहले आवंटन करने और सॉर्ट ऑपरेशंस के लिए पुन: उपयोग करने की अनुमति देगी। [सीयूबी] (http://nvlabs.github.io/cub/), [बी 40 सी] (http://code.google.com/p/back40computing/), और [एमजीपीयू] (http: //nvlabs.github .io/moderngpu /) सभी संभावनाएं हैं। –
हाँ मैंने सीयूबी और बी 40 सी में देखा है (बी 40 सी साइट का कहना है कि परियोजना को हटा दिया गया है)। जोर से हटाने के लिए काम करने से पहले, मैं पुस्तकालयों के बीच कुछ तुलना ग्राफ देखना चाहता हूं। क्या आप मुझे कुछ प्रदर्शन संख्याओं पर इंगित कर सकते हैं? आप किस पुस्तकालय की सिफारिश करते हैं? ... ऐसा लगता है कि जोर बहुत अधिक प्रदर्शन नहीं है, उदाहरण के लिए, मैंने पहले से ही जोर से एक समूह को स्विच कर दिया है :: मेरे खुद के कस्टम कर्नेल के साथ कम करें और कम करें_by_key कॉल करें - यह मेरा प्रोसेसिंग समय आधा में कटौती कर रहा है। कोई मजाक नहीं। – rmccabe3701
जोर वास्तव में बी 40 सी (या होने के लिए इस्तेमाल किया गया) के एक विशेष संस्करण पर आधारित है। समकक्ष परीक्षण मामलों के लिए, बी 40 सी और एमजीपीयू के बीच मेरे परीक्षण में बहुत अंतर नहीं था। एक परीक्षण में मैंने भाग लिया, मैं केवल 32 बिट मूल्य के लगभग 22 बिट्स पर छंटनी कर रहा था। एमजीपीयू के पास एक डायल था जो मैं केवल 22 बिट्स पर सॉर्ट कर सकता था, और मैंने उस पर जोर देने के लिए 40% की गति के बारे में देखा। मैंने बहुत ज्यादा इस्तेमाल नहीं किया है। यदि आप उन लिंक के माध्यम से पोक करते हैं, तो आपको कुछ प्रदर्शन डेटा मिल सकता है। उदाहरण के लिए कुछ एमजीपीयू परफ डेटा [यहां] (http://nvlabs.github.io/moderngpu/performance.html#performance) –