2012-07-02 12 views
7

मैं समांतर प्रोग्रामिंग में शुरुआत कर रहा हूं। मेरे पास एक प्रश्न है जो मूर्खतापूर्ण प्रतीत हो सकता है लेकिन जब मैंने इसे बाहर निकाला तो मुझे एक निश्चित जवाब नहीं मिला।GPU CPU या CPU से पढ़ता है GPU को लिखता है?

जीपीयू कंप्यूटिंग में एक डिवाइस है यानी जीपीयू और मेजबान यानी सीपीयू है। मैंने एक सरल हैलो वर्ल्ड प्रोग्राम लिखा है जो जीपीयू पर कुछ मेमोरी आवंटित करेगा, कर्नेल में दो पैरामीटर (src [] और dest []] कहें, कॉपी स्ट्रिंग यानी हैलो वर्ल्ड स्ट्रिंग को स्ट्रिंग करें और dest स्ट्रिंग को gpu से प्राप्त करें मेज़बान।

क्या GPU या CPU द्वारा पढ़ी गई स्ट्रिंग "src" GPU को लिखती है? साथ ही जब हम GPU से स्ट्रिंग वापस लेते हैं, तो GPU को CPU या CPU को GPU से पढ़ने के लिए लिखा जाता है?

डेटा आगे और पीछे स्थानांतरित में वहाँ चार संभावनाएँ 1. सीपीयू GPU के लिए हो सकता है - सीपीयू GPU लिए लिखते हैं - GPU सीपीयू के रूप सीपीयू 2. GPU पढ़ता है - GPU सीपीयू लिए लिखते हैं - सीपीयू GPU

से पढ़ता है क्या कोई यह बता सकता है कि इनमें से कौन सा संभव है और कौन नहीं है?

उत्तर

7

सीयूडीए और इसी हार्डवेयर मॉडल के पुराने संस्करणों में, जीपीयू अधिक सख्ती से सीपीयू के स्वामित्व वाले एक कॉप्रोसेसर था; सीपीयू ने जीपीयू को जानकारी लिखी, और GPU तैयार होने पर जानकारी को वापस पढ़ें। निचले स्तर पर, इसका मतलब था कि वास्तव में सभी चार चीजें हो रही थीं: सीपीयू ने पीसीआई को डेटा लिखा, जीपीयू पीसीआई से डेटा पढ़ा, जीपीयू ने पीसीआई को डेटा लिखा, और सीपीयू परिणाम को वापस पढ़ा। लेकिन सीपीयू द्वारा लेनदेन शुरू किया गया था।

हाल ही में (CUDA 3? 4? शायद 2 में भी शुरू हो सकता है?), इनमें से कुछ विवरण एप्लिकेशन स्तर से छिपाए गए हैं, ताकि प्रभावी ढंग से, GPU कोड ट्रांसफर को उसी तरह से शुरू किया जा सके सीपीयू कर सकते हैं। एकीकृत वर्चुअल एड्रेसिंग पर विचार करें, जिससे प्रोग्रामर CPU और GPU मेमोरी के लिए एक एकीकृत वर्चुअल एड्रेस स्पेस तक पहुंच सकते हैं। जब GPU CPU स्थान में स्मृति का अनुरोध करता है, तो उसे सीपीयू से स्थानांतरण को अनिवार्य रूप से सीपीयू से ट्रांसफर करना होगा। सीपीयू पक्ष से जीपीयू पर डेटा डालने की क्षमता भी बरकरार रखी जाती है। मूल रूप से, सभी तरह से अब संभव हो रहे हैं, शीर्ष स्तर पर (निम्न स्तर पर, यह काफी हद तक हमेशा की तरह प्रोटोकॉल का एक ही प्रकार है: दोनों से पढ़ सकते हैं और PCIe बस के बारे में है, लेकिन अब, GPUs के लेनदेन आरंभ रूप में अच्छी तरह कर सकते हैं)।

+1

जो विभिन्न सिंक्रनाइज़ नियंत्रकों के माध्यम से डीएमए (http://en.wikipedia.org/wiki/Direct_memory_access) तक उबाल जाता है। – Ani

+0

बहुत बहुत धन्यवाद। यह जानना अच्छा है कि जीपीयू भी लेन-देन शुरू कर सकता है। तो क्या यह जानने का कोई तरीका है कि ओपनक्ल में लाइब्रेरी रूटीन का उपयोग करके वास्तव में लेन-देन किसने शुरू किया? या दिनचर्या जिसका उपयोग मैं या तो सीपीयू या जीपीयू को लेनदेन करने के लिए मजबूर कर सकता हूं ..? – Nike

+0

मुझे ओपनसीएल के साथ-साथ मुझे नहीं पता होना चाहिए; कहा जा रहा है कि, मुझे आश्चर्य होगा कि अगर CUDA ने आपको कुछ वर्चुअल एड्रेस स्पेस में एक चर रहता था, तो यह देखने के लिए * कुछ * तरीका नहीं दिया। उस प्रकार की जानकारी उपयोगी हो सकती है, यहां तक ​​कि स्पष्ट रूप से प्रबंधित स्थानान्तरण के उपयोग-मामले के बाहर भी (जो नए संस्करणों को अभी भी समर्थन देना चाहिए)। – Patrick87

1

ओपनसीएल में होस्ट (सीपीयू) विशेष रूप से जीपीयू और जीपीयू के बीच डेटा के सभी स्थानांतरण को नियंत्रित कर रहा है। होस्ट बफर का उपयोग कर GPU को डेटा स्थानांतरित करता है। बफर का उपयोग कर GPU से मेजबान स्थानान्तरण (पढ़ता है) वापस लेता है। कुछ सिस्टम और उपकरणों के लिए, स्थानांतरण शारीरिक रूप से बाइट्स की प्रतिलिपि नहीं बना रहा है क्योंकि होस्ट और जीपीयू एक ही भौतिक स्मृति का उपयोग करते हैं। इसे शून्य प्रतिलिपि कहा जाता है।

2

असल में इनमें से कोई भी नहीं। आपका सीपीयू कोड डेटा की प्रति आरंभ करता है, लेकिन डेटा को आपके सिस्टम पर जो भी बस है, उसके माध्यम से GPU की स्मृति में स्मृति नियंत्रक द्वारा स्थानांतरित किया जाता है। इस बीच, सीपीयू अन्य डेटा संसाधित कर सकते हैं। इसी तरह, जब GPU कर्नेल आप का शुभारंभ चलना समाप्त कर दिया, अपने CPU कोड डेटा की प्रतिलिपि शुरू की, लेकिन इस बीच दोनों GPU और सीपीयू अन्य डेटा को संभालने या अन्य कोड चला सकते हैं।

प्रतियों को एसिंक्रोनस या गैर-अवरोध कहा जाता है। आप वैकल्पिक रूप से प्रतियां, जिसमें प्रति के लिए सीपीयू इंतजार पूरा होने की अवरुद्ध कर सकते हैं।

जब अतुल्यकालिक कार्य शुरू करने, आप आमतौर पर एक "घटना" है, जो ध्वज है कि आप बाद में जांच कर सकते हैं, अगर काम या पूरा नहीं हुआ है देखने के लिए किसी तरह का है रजिस्टर।

1

मुझे अभी इस मंच में http://devgurus.amd.com/thread/129897 पता चला है जो CL_MEM_ALLOC_HOST_PTR का उपयोग कर रहा है। CLCREATEBuffer में CL_MEM_COPY_HOST_PTR होस्ट पर स्मृति आवंटित करता है और यह डिवाइस पर कॉपी नहीं किया जाएगा।

प्रदर्शन के साथ समस्या हो सकती है लेकिन यह वही है जो मैं ढूंढ रहा हूं। आपकी टिप्पणियां कृपया ..

संबंधित मुद्दे