2013-02-11 42 views
8

मैं यह पता लगाने की कोशिश कर रहा हूं कि क्यों cudaMemcpyFromSymbol() मौजूद है। यह सब कुछ लगता है कि 'प्रतीक' func कर सकते हैं, nonSymbol cmds कर सकते हैं।cudaMemcpy() बनाम cudaMemcpyFromSymbol()

प्रतीक func किसी सरणी या अनुक्रमणिका को स्थानांतरित करने के लिए आसान बनाता है, लेकिन यह nonSymbol फ़ंक्शन के साथ आसानी से किया जा सकता है। मुझे संदेह है कि nonSymbol दृष्टिकोण तेजी से चल जाएगा क्योंकि कोई प्रतीक-लुकअप आवश्यक नहीं है। (यह स्पष्ट नहीं है कि प्रतीक दिखने की गणना संकलन या रन टाइम पर की जाती है।)

मैं cudaMemcpyFromSymbol() बनाम cudaMemcpy( का उपयोग क्यों करूं?)

+0

मुझे लगता है कि आप केवल 'cudaMemcpyFromSymbol()' का उपयोग करके निरंतर स्मृति से प्रतिलिपि बना सकते हैं लेकिन मुझे यकीन नहीं है। –

+2

@ Soroosh129 ... इसका उपयोग वैश्विक '__device__' चर से कॉपी करने के लिए भी किया जा सकता है। – sgarizvi

+0

@ sgar91 वाह अच्छा! तुम यह कर सकते हो? –

उत्तर

9

cudaMemcpyFromSymbol डिवाइस मेमोरी में सांख्यिकीय रूप से परिभाषित चर से कॉपी करने का कैननिकल तरीका है।

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

+2

एक चर को '__device__' के रूप में परिभाषित करते समय, चर के दो संस्करण परिभाषित किए गए हैं। मेजबान पर एक और डिवाइस पर एक। होस्ट कोड में '&' के साथ चर के पते को लेना, होस्ट संस्करण का पता उत्पन्न करता है। 'cudaGetSymbolAddress()' डिवाइस संस्करण का पता उत्पन्न करता है। '__device__' सजावट केवल स्थिर रूप से परिभाषित चर पर उपयोग किया जा सकता है। –

+2

@RogerDahl: यह संभवतः यह कहना बेहतर है कि * किसी भी * स्थैतिक रूप से परिभाषित डिवाइस प्रतीक (\ _ \ _ डिवाइस \ _ \ _, \ _ \ _ निरंतर \ _ \ _, यहां तक ​​कि बनावट) परिणामस्वरूप टूलचेन में दो * प्रतीक * उत्सर्जित होते हैं, डिवाइस मॉड्यूल में से एक, मेजबान ऑब्जेक्ट में दूसरा। CUDA रनटाइम इन दो प्रतीकों के बीच गतिशील मैपिंग सेट अप करता है और बनाए रखता है। प्रतीक एपीआई कॉल \ _ \ _ निरंतर \ _ \ _ और \ _ \ _ डिवाइस \ _ \ _ प्रतीकों के लिए इस मैपिंग को पुनर्प्राप्त करने का तरीका है। बनावट एपीआई बनावट प्रतीक आदि के लिए मैपिंग पुनर्प्राप्त करता है। – talonmies