2010-06-21 7 views
5

अस्पष्ट विषय प्रश्न के लिए खेद है, लेकिन मैं कुछ अकादमिक वीडियो प्रोसेसिंग दिनचर्या पर काम कर रहा हूं। एल्गोरिदम MATLAB में लिखे गए हैं, और विकास के उद्देश्यों के लिए यह ठीक है, लेकिन यह लगभग 60spf, या लगभग .0166fps पर एक वीडियो को संसाधित करता है। कहने की जरूरत नहीं है, यह डेमो के लिए पर्याप्त नहीं होगा और इसलिए, मेरी ग्रीष्मकालीन नौकरी दिनचर्या को उस चीज़ में परिवर्तित करना है जो बहुत तेजी से चलती है।एक शर्मनाक समानांतर समस्या के लिए सबसे अच्छा समाधान क्या है?

मैंने सीयूडीए, एनवीडिया के जीपीजीपीयू समाधान के लिए कोड के सबसे धीमे हिस्से को फिर से लिखा है। हालांकि, कोड का एक बड़ा हिस्सा भी है जो सीपीयू पर बेहतर होता है, क्योंकि यह अपेक्षाकृत धारावाहिक है। समस्या यह है कि, मुझे दी गई मशीन में 2 ज़ीऑन प्रोसेसर हैं, जिसमें 8 लॉजिकल कोर कुल हैं, और केवल एक कोर के लिए कोडिंग करके जीपीयू कोड को बाधित करना शर्म की बात है। वीडियो रूपांतरण प्रक्रिया कार्यात्मक है कि प्रत्येक फ्रेम अन्य फ्रेम पर निर्भर नहीं है, इसलिए मैं सोच रहा था कि किसी प्रकार की एसिंक्रोनस कतार/स्ट्रीम सबसे अच्छी होगी।

यहां मेरा प्रश्न है: गति उपज के प्रयास के सर्वोत्तम अनुपात के साथ इस प्रकार के समांतरता को प्राप्त करने का सबसे अच्छा तरीका क्या होगा?

कुछ समाधान जो मैंने देखा है ओपनएमपी, नेट टीपीएल, और बस सरल पठ्रेड हैं।

मेरे पास केवल असीमित प्रोग्रामिंग के लिए बुनियादी जोखिम है, इसलिए मैं म्यूटेक्स और बाधाओं के साथ गड़बड़ के बजाय लाइब्रेरी या कुछ का उपयोग करता हूं और कई बार पैर में खुद को गोली मारता हूं। मुझे सीखने में कोई फर्क नहीं पड़ता, क्योंकि यह इस गर्मी के लिए मेरे लक्ष्यों में से एक है, लेकिन साथ ही, समांतरता हार्ड है। हालांकि, अगर गति अंतर वास्तव में बहुत ही ध्यान देने योग्य है, तो मैं अपने बालों को कुछ हफ्तों तक खींचने के लिए तैयार हूं। : पी

अग्रिम धन्यवाद।

+0

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

उत्तर

3

यदि उपज करने के प्रयास को अधिकतम करने का लक्ष्य आपका लक्ष्य है, तो मैं टीईपी को .NET में देखने की अनुशंसा करता हूं। यह शायद इसे लागू करने का सबसे आसान तरीका है। आपका कोड क्या कर रहा है, इस पर निर्भर करता है कि आप या तो एक पाइपलाइन बना सकते हैं या प्रत्येक "फ्रेम" पर Parallel.For (या ForEach) का भी उपयोग कर सकते हैं।

कहा जा रहा है कि, यदि आप देशी, गैर-प्रबंधित कोड से चिपकना चाहते हैं, तो एक अच्छा विकल्प माइक्रोसॉफ्ट के नए Parallel Patterns Library या Intel's Threading Building Blocks हो सकता है। दोनों के पास नए टीपीएल के लिए समान संरचनाएं होती हैं, खासतौर से डेटा समांतरता के लिए, और यह समानांतर करने के लिए काफी आसान बनाती है, जब तक कि "प्रत्येक फ्रेम अन्य फ्रेम पर निर्भर न हो" सत्य बना रहता है।

+0

मुझे इसे मारो! एडी मिलर ने टेकएड पर समानता विकल्पों पर टेकएड पर अच्छी बात की थी। नेट 4.0: http://www.msteched.com/2010/NorthAmerica/ARC205 – Mathias

+0

पीपीएल ऐसा लगता है जो मैं ढूंढ रहा हूं, धन्यवाद। हालांकि एक प्रश्न, प्रबंधित कोड का उपयोग कर रहा है जैसे सी # धीमा डाउन कोड जैसे मेरा ध्यान, जहां यह मुख्य रूप से बड़े सरणी पर अंकगणित बिंदु है? मुझे बहुत सरल प्रोग्रामिंग वातावरण पसंद है, लेकिन वीडियो प्रसंस्करण जैसी चीजों के साथ, मैं कचरा संग्रह और बाध्य जांच ओवरहेड के डर के कारण हमेशा संकोच करता हूं। यह पुराना सी प्रोग्रामिंग पैरानोआ हो सकता है हालांकि: \ – Xzhsh

+0

Xzhsh: मैं व्यक्तिगत रूप से सी # और अपने "दिन की नौकरी" में वैज्ञानिक डेटा प्रोसेसिंग के लिए प्रबंधित कोड का उपयोग करता हूं। यह बहुत अच्छा है, लेकिन perf। विशेषताओं देशी कोड से अलग हैं - इसलिए आपको अपनी सोच को क्षतिपूर्ति करने के लिए अनुकूलित करना होगा। मैं व्यक्तिगत रूप से, जीसी के बारे में चिंता नहीं करता, लेकिन सरणी सीमाओं की जांच आपको धीमा कर सकती है (इसे अक्षम किया जा सकता है)। ज्यादातर मामलों में, हालांकि, सावधानीपूर्वक प्रोफाइलिंग और "अच्छा" प्रबंधित कोड कोड को जन्म दे सकता है जो देशी कोड की तुलना में तेज़ (और अक्सर तेज) होता है। –

1

मेरी सलाह एक कदम-दर-चरण फैशन में पहुंचने के लिए होगी।

  1. सबसे पहले, साबित करें कि आपके पास एक कार्यात्मक गैर-MATLAB कार्यान्वयन है। यह गैर-तुच्छ है और, स्पष्ट रूप से, मुझे लगता है कि प्रदर्शन के बारे में सोचने से पहले आपको 100% मस्तिष्क चक्रों को शुद्धता प्राप्त करने पर योजना बनाने की योजना बनाना चाहिए।

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

  3. उन पुस्तकालयों या ढांचे के वाक्यविन्यास की पहचान करें जिन्हें आप रुचि रखते हैं, उन्हें समानांतर में धागे/प्रक्रियाएं बनाने, उन्हें लॉन्च करने और पूरा होने के बाद उनके परिणामों में शामिल होने की आवश्यकता होगी। नोट: आपको साझा डेटा, आदि पर आपसी बहिष्करण की आवश्यकता होगी। उदाहरण के लिए, जावा दुनिया में, यह java.util.concurrency होगा।

  4. आधे में अपने काम को विभाजित करने के लिए दो (केवल दो) धागे बनाने का प्रयास करें। बेंचमार्क लिखें जो आपको अपने प्रारंभिक समाधान, एन = 2 धागे के समाधान का समाधान करने और परिणामों के नरक को प्रोफाइल करने की अनुमति देते हैं।

  5. केवल तभी आपको आगे समानांतरता के बारे में सोचना चाहिए।

आप इस तरह के चरणों का पालन करें, तो आप करेंगे (क) अपने वास्तविक कार्य (MATLAB से बंदरगाह) में सफल होने, (ख) कुछ है कि कुछ ज्ञात प्रदर्शन मीट्रिक काम करता है और (ग) एक स्पष्ट है यदि आप लंबित अवसरों का और अधिक फायदा उठाना चाहते हैं तो आगे बढ़ें।

+0

टिप बॉब के लिए धन्यवाद! मैंने पहले से ही अधिकांश सी पर दिनचर्या बंद कर दी है, और समांतरता केवल फ्रेम के बीच होगी जो पूरी तरह से स्वतंत्र हैं। मुझे आपकी सलाह पसंद है, और मुझे अपने अगले प्रोजेक्ट – Xzhsh

+0

@Xzhsh, FYI के लिए अपने स्वयं के ग्राफिक्स काम में ध्यान में रखना सुनिश्चित होगा, व्यक्तिगत प्रोसेसर को स्वतंत्र रूप से एक संपूर्ण फ्रेम असाइन करने के बजाय वास्तव में सर्वश्रेष्ठ समांतरता प्रति फ्रेम थी । साझा वातावरण ने पिक्सेल को विभिन्न धागे में विभाजित करने और एक फ्रेम की गणना तेज करने के लिए दृढ़ता से प्रेरित किया (यह सब के बाद एक रेट्रेटर था)। आपके प्रोजेक्ट के हिस्से के रूप में जांच करने के लिए दृष्टिकोण की पसंद शायद एक और अच्छा विषय है। –

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

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