2012-04-13 26 views
10

मैं दिनों के लिए CUDA कर्नेल के साथ प्रयोग किया गया है (लेकिन मैं यह भी आयाम भिन्न हो सकता है) और एक 500x500 छवि के बीच एक तेजी से 2 डी घुमाव के प्रदर्शन एक बहुत छोटे से 2 डी कर्नेल में (एक laplacian 2 डी कर्नेल, तो यह एक 3x3 कर्नेल है .. सभी cuda धागे के साथ एक बड़ा फायदा लेने के लिए बहुत छोटा)।CUDA छोटे गिरी 2 डी घुमाव - कैसे करना है यह

मैंने एक सीपीयू क्लासिक कार्यान्वयन बनाया है (लूप के लिए दो, जैसा कि आप सोचेंगे उतना आसान) और फिर मैंने CUDA कर्नेल बनाना शुरू कर दिया।

में कुछ निराशाजनक प्रयासों के बाद एक तेजी से घुमाव मैं इस कोड के साथ समाप्त हो गया प्रदर्शन करने के लिए: http://www.evl.uic.edu/sjames/cs525/final.html (साझा मेमोरी अनुभाग देखें), यह मूल रूप से एक 16x16 धागे लोड सभी घुमाव के डेटा वह साझा स्मृति में की जरूरत को ब्लॉक कर देता है और फिर दृढ़ संकल्प करता है।

कुछ भी नहीं, सीपीयू अभी भी बहुत तेज़ है। मैंने एफएफटी दृष्टिकोण की कोशिश नहीं की क्योंकि सीयूडीए एसडीके का कहना है कि यह बड़े कर्नेल आकारों के साथ कुशल है।

या नहीं, तुम सब कुछ मैंने लिखा पढ़ा, मेरे सवाल यह है:

कैसे मैं एक अपेक्षाकृत बड़े छवि और CUDA के साथ एक बहुत छोटे से गिरी (3x3) के बीच एक तेज 2 डी घुमाव के प्रदर्शन कर सकते हैं?

+4

"सीपीयू अभी भी बहुत तेज़ है" का क्या मतलब है? क्या आप पूर्ण कार्यक्रम का समय दे रहे हैं जिसमें GPU से और उसके लिए स्मृति की प्रतिलिपि बनाना, या कर्नेल को लॉन्च करने और पूरा करने के लिए केवल समय लगता है? –

+0

मुझे अब समय की आवश्यकता नहीं है, मैं देख सकता हूं कि सीपीयू वाला प्रोग्राम बहुत तेज़ खत्म हो जाता है :( – paulAl

उत्तर

7

आप सही हैं कि 3x3 कर्नेल एफएफटी आधारित दृष्टिकोण के लिए उपयुक्त नहीं है। इससे निपटने का सबसे अच्छा तरीका कर्नेल को निरंतर स्मृति में धक्का देना होगा (या यदि आप फर्मि + कार्ड का उपयोग कर रहे हैं, तो इससे कोई फर्क नहीं पड़ता)।

चूंकि आप कर्नेल आकार को जानते हैं, ऐसा करने का सबसे तेज़ तरीका साझा छवि में इनपुट छवि/सिग्नल के हिस्सों को पढ़ना होगा और एक अनियंत्रित गुणा करें और ऑपरेशन जोड़ें।

-

आप इस आपरेशन ArrayFire और OpenCV अत्यधिक कनवल्शन दिनचर्या है कि आप विकास में बहुत समय बचा सकते हैं अनुकूलित किया है प्रदर्शन करने के लिए पुस्तकालयों का उपयोग करने के लिए तैयार हैं, तो।

मैं OpenCV से बहुत परिचित नहीं हूं, लेकिन ArrayFire में आप निम्न की तरह कुछ कर सकते हैं।

array kernel = array(3, 3, h_kernel, afHost); // Transfer the kernel to gpu 
array image = array(w, h, h_image , afHost); // Transfer the image to gpu 
array result = convolve2(image, kernel);  // Performs 2D convolution 

संपादित

की ArrayFire का उपयोग कर अपने बैच ऑपरेशन है अतिरिक्त लाभ आप समानांतर में घुमाव के प्रदर्शन करने के लिए अनुमति देता है। यदि आप 10 चित्र थे आप कैसे convolvutions here

से अधिक बैच कार्य का समर्थन उदाहरण के लिए के बारे में पढ़ सकते हैं कि आप, आपके पास निम्न की तरह somehting कर सकता है एक ही कर्नेल का उपयोग कर convolve हैं:

array kernel = array(3, 3, h_kernel, afHost);  // Transfer the kernel to gpu 
array images = array(w, h, 10, h_images, afHost); // Transfer the images to gpu 
array res = convolve2(images, kernel); // Perform all operations simultaneously 

-

पूर्ण प्रकटीकरण: मैं एक्सेलेरियस पर काम करता हूं और सक्रिय रूप से ऐरेफ़ीयर पर काम करता हूं।

+0

लिंक मर चुके हैं।चोट के अपमान को जोड़ने के लिए, उनमें से वेबैक मशीन संग्रह स्पष्ट रूप से शुद्ध किया गया है: http://www.accelereyes.com/robots.txt – Hjulle

+0

@Hjulle हम Accelereyes से सरणी के लिए rebranded। लिंक मेरे लिए हमारे वर्तमान दस्तावेज पर रीडायरेक्ट कर रहे थे। मुझे खेद है यदि आपको समस्याएं थीं। मैंने सरणी की नवीनतम संस्करण को प्रतिबिंबित करने के लिए कोड और लिंक अपडेट किए। –

+0

मुझे खेद है अगर मैं नाराज लग रहा था, धन्यवाद। ओपनसीवी लिंक अभी भी टूटा हुआ है। – Hjulle

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

  • कोई संबंधित समस्या नहीं^_^