2012-01-30 15 views
7

में लगातार स्मृति उपयोग मैं इसे स्वयं नहीं समझ सकता, यह सुनिश्चित करने का सबसे अच्छा तरीका है कि मेरे कर्नेल में उपयोग की गई स्मृति स्थिर है। http://stackoverflow...r-pleasant-way पर एक समान प्रश्न है। मैं GTX580 के साथ काम कर रहा हूं और केवल 2.0 क्षमता के लिए संकलित कर रहा हूं।CUDA कोड

cudaMalloc(src, size); 
cudaMemcpy(src, hostSrc, size, cudaMemcpyHostToDevice); 
Foo<<<...>>>(src, result); 

वैकल्पिक तरीका है

__constant__ src[size]; 

फ़ाइल .cu में जोड़ने के लिए, से src हटाने सूचक: मेरी गिरी

तरह
__global__ Foo(const int *src, float *result) {...} 

मैं मेजबान पर निम्नलिखित कोड निष्पादित लग रहा है कर्नेल और निष्पादित

cudaMemcpyToSymbol("src", hostSrc, size, 0, cudaMemcpyHostToDevice); 
Foo<<<...>>>(result); 

क्या ये दो तरीके बराबर हैं या पहला व्यक्ति वैश्विक स्मृति की बजाय निरंतर स्मृति के उपयोग की गारंटी नहीं देता है? आकार गतिशील रूप से परिवर्तन करता है इसलिए दूसरा तरीका मेरे मामले में आसान नहीं है।

उत्तर

14

दूसरा तरीका यह सुनिश्चित करने का एकमात्र तरीका है कि सरणी को निरंतर स्मृति में संकलित किया गया है और निरंतर स्मृति कैश के माध्यम से सही ढंग से पहुंचा जा सकता है। लेकिन आपको खुद से पूछना चाहिए कि उस सरणी की सामग्री को धागे के ब्लॉक में कैसे पहुंचाया जा रहा है। यदि प्रत्येक थ्रेड समान रूप से सरणी तक पहुंच जाएगा, तो निरंतर स्मृति का उपयोग करने में एक प्रदर्शन लाभ होगा, क्योंकि निरंतर मेमोरी कैश से प्रसारण तंत्र होता है (यह ग्लोबल मेमोरी बैंडविड्थ भी बचाता है क्योंकि निरंतर मेमोरी ऑफ्रिप डीआरएएम और कैश में संग्रहीत होती है डीआरएएम लेनदेन गिनती को कम करता है)। लेकिन अगर पहुंच यादृच्छिक है, तो स्थानीय स्मृति तक पहुंच का क्रमबद्धता हो सकती है जो प्रदर्शन को नकारात्मक रूप से प्रभावित करेगी।

विशिष्ट चीजें जो __constant__ मेमोरी के लिए उपयुक्त हो सकती हैं, मॉडल गुणांक, भार, और अन्य निरंतर मान होंगे जिन्हें रनटाइम पर सेट करने की आवश्यकता है। फर्मि जीपीयू पर, कर्नेल तर्क सूची निरंतर स्मृति में संग्रहीत है, उदाहरण के लिए। लेकिन यदि सामग्री गैर-समान रूप से पहुंचती है और सदस्यों का प्रकार या आकार कॉल टू कॉल से निरंतर नहीं है, तो सामान्य वैश्विक मेमोरी बेहतर है।

यह भी ध्यान रखें कि प्रति GPU संदर्भ के 64kb निरंतर स्मृति की सीमा है, इसलिए यह लगातार स्मृति में बहुत बड़ी मात्रा में डेटा स्टोर करना व्यावहारिक नहीं है। यदि आपको कैश के साथ बहुत से पढ़ने-योग्य स्टोरेज की आवश्यकता है, तो यह एक बनावट के लिए डेटा को बाध्य करने की कोशिश कर सकता है और देख सकता है कि प्रदर्शन कैसा है। प्री-फर्मि कार्ड पर, यह आमतौर पर एक आसान प्रदर्शन लाभ पैदा करता है, फर्मि पर परिणाम उस वास्तुकला में कैश लेआउट में सुधार के कारण वैश्विक स्मृति की तुलना में कम अनुमानित हो सकते हैं।

0

पहला तरीका यह गारंटी देगा कि स्मृति Foo फ़ंक्शन के अंदर स्थिर है। दोनों बराबर नहीं हैं, दूसरा इसकी प्रारंभिकता के बाद वहां पर निर्भर करता है। यदि आपको पहले तरीके से कुछ उपयोग करने के लिए गतिशीलता की आवश्यकता है।