2012-09-17 34 views
7

में किसी सरणी से शून्य मानों को कैसे निकालें I CUDA का उपयोग करके समानांतर में सरणी से शून्य मानों को कुशलतापूर्वक कैसे हटा सकते हैं। शून्य मानों की संख्या के बारे में जानकारी अग्रिम में उपलब्ध है, जो इस कार्य को सरल बनाना चाहिए।समानांतर

यह महत्वपूर्ण है कि परिणामी सरणी में कॉपी होने पर संख्याओं को स्रोत सरणी, में आदेश दिया गया हो।


उदाहरण:

सरणी उदा होगा निम्नलिखित मान हैं: [0, 0, 1 9, 7, 0, 3, 5, 0, 0, 1] अतिरिक्त जानकारी के साथ 5 मान शून्य हैं। [19, 7, 3, 5, 1] ​​

+0

में वर्णित निश्चित रूप से आप शून्य निकालना चाहते है ? यदि आप गैर शून्य को हटाते हैं तो आपको केवल शून्य की सरणी मिल जाएगी ?! –

+0

हाँ ने इसे सही किया। मैं स्रोत सरणी से शून्य मानों को हटाने के लिए एक प्रभावी तरीका ढूंढ रहा हूं। –

+0

मैं कोडा थ्रेड के माध्यम से लूप को प्रतिस्थापित करना चाहता हूं, जो प्रभावी रूप से हटाने को समानांतर करता है। –

उत्तर

7

एक सरणी आप Thrust Library's compaction operations उपयोग कर सकते हैं के कुछ तत्वों को खत्म करने के लिए: वांछित अंतिम परिणाम तो युक्त एक और सरणी होगा। एक विधेय is_not_zero, जो false शून्य के लिए मूल्यों, और दूसरों के लिए true देता है, तो आप इस

thrust::copy_if(in_array, in_array + size, out_array, is_not_zero); 

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

.. तुम भी उपयोग कर सकते हैं एक रिवर्स विधेय के साथ "remove_if" समारोह जो शून्य के लिए true लौटने के लिए, और दूसरों के लिए false

thrust::remove_if(in_array, in_array + size, is_zero); 

मैं सुझाव है कि आप थ्रस्ट पुस्तकालय, या सामान्य के संघनन उदाहरणों पर एक नज़र ले जा कॉम्पैक्शन अवधारणा।

http://code.google.com/p/thrust/source/browse/examples/stream_compaction.cu

+0

मैं उस परियोजना में जोर देने में सक्षम नहीं हो सकता, लेकिन अगर मैं कर सकता हूं तो मैं आपके प्रस्ताव का उपयोग करूंगा। आपकी मदद के लिए Thx। –

+2

समान पुस्तकालय हैं और कॉम्पैक्शन के लिए सिर्फ कर्नेल कार्यान्वयन हैं। आपको इस फ़ंक्शन के लिए जोर का उपयोग करने की आवश्यकता नहीं हो सकती है, मेरा सुझाव है कि आप इसका उपयोग करें। बस सीयूडीए एसडीके के उदाहरण देखें। – phoad

0

क्या का एक परिवर्तन के बारे में अजीब भी तरह किसी भी छँटाई एल्गोरिथ्म, जहां आदेश a < b === (a != 0 && b == 0) द्वारा परिभाषित किया गया विलय, या वास्तव में?

+1

यह एक-बिट प्रकार है, इसलिए कोई सामान्य मर्ज सॉर्ट से बहुत बेहतर कर सकता है। –

+0

@ जेरेडबॉबरॉक: ठीक है, मैंने आपको एक अलग कामकाजी दृष्टिकोण का प्रस्ताव नहीं देखा है जो बहुत बेहतर काम करता है। – wilx

+0

एक सॉर्टिंग दृष्टिकोण के साथ एक और समस्या यह है कि यह इनपुट को नष्ट कर देगा, जो @ diver_182 इनपुट सरणी में संरक्षित करना चाहता है।'remove_copy_if' इस मामले के लिए ऊपर @phoad नोट्स के रूप में बेहतर काम करेगा। –

1

आप थ्रस्ट का उपयोग नहीं करना चाहते हैं और आप CUDA का उपयोग करना पसंद करते हैं, तो ऐसा करने के लिए शायद सबसे अच्छी बात योग स्कैन चलाने के लिए, विस्तार यहाँ

http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter36.html

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