2012-06-22 8 views
6

मेरे पास एक ऐसा एप्लिकेशन है जो CUDA में समीकरणों की एक प्रणाली को हल करता है, मुझे यकीन है कि प्रत्येक थ्रेड को 4 समाधान मिल सकते हैं, लेकिन फिर मैं मेजबान पर वापस कैसे कॉपी कर सकता हूं?CUDA में धागे से डेटा कुशलता से एकत्र करने के लिए कैसे?

मैं सभी थ्रेड स्टोर 4 समाधान (प्रत्येक समाधान के लिए 4 युगल) के लिए पर्याप्त जगह के साथ एक विशाल सरणी पास कर रहा हूं, और दूसरा थ्रेड प्रति समाधान की संख्या के साथ, हालांकि यह एक निष्क्रिय समाधान है, और वर्तमान बाधा है मेरे कर्नेल का।

मैं वास्तव में इसे अनुकूलित करना चाहता हूं। मुख्य समस्या एक ही सरणी में प्रति थ्रेड के एक चर संख्या के समाधान को जोड़ती है।

+0

यदि मैं आपके कार्यक्रम के बारे में कुछ और जानता था तो यह मदद करना बहुत आसान होगा। मेरे ज्ञान के लिए (यह लगभग एक साल हो गया है क्योंकि मैं कुडा के साथ गड़बड़ करता हूं इसलिए मैं गलत हो सकता हूं), जानकारी प्राप्त करने का एकमात्र तरीका ज्ञापन है और वे धीमे हैं। और किस कार्ड पर कुडा का संस्करण? – 8bitwide

+0

मुझे एक CUDA 4.0 और 4.2 उपलब्ध है। – RSFalcon7

+0

कोड यहां डालने के लिए बहुत बड़ा है। मैं मानता हूं कि cudaMemCpy परिणाम प्राप्त करने का यही एकमात्र तरीका है, लेकिन मैं कचरा प्रतिलिपि से बच सकता हूं। – RSFalcon7

उत्तर

5

जो कार्यक्षमता आप खोज रहे हैं उसे स्ट्रीम कंपैक्शन कहा जाता है।

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

हालांकि, एक और सामान्य स्थिति दी गई है, जहां परिणामों की उचित संख्या है, सबसे अच्छा समाधान एक अलग चरण के रूप में एक कॉम्पैक्टिंग ऑपरेशन करने के लिए होगा। ऐसा करने का एक तरीका thrust::copy_if के साथ है। कुछ और पृष्ठभूमि के लिए this question देखें।

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