2010-01-30 21 views
14

का उपयोग करने के लिए सी ++ एप्लिकेशन को कैसे व्यवस्थित किया जाए, मैं एक ऐसा एप्लीकेशन बना रहा हूं जो वीडियो कैमरा फीड से कुछ ऑब्जेक्ट ट्रैकिंग करे और OpenGL में कण प्रणाली चलाने के लिए उस से जानकारी का उपयोग करे। वीडियो फीड को संसाधित करने के लिए कोड कुछ हद तक धीमा है, अभी प्रति फ्रेम 200 - 300 मिलीसेकंड। जिस प्रणाली पर यह चल रहा है वह दोहरी कोर प्रोसेसर है। प्रदर्शन को अधिकतम करने के लिए मैं एक प्रोसेसर में कैमरा प्रसंस्करण सामग्री को ऑफ़लोड करना चाहता हूं और अन्य प्रोसेसर पर लात मारने वाले मुख्य एप्लिकेशन को छोड़कर, प्रासंगिक एप्लिकेशन को मुख्य एप्लिकेशन पर वापस संवाद करना चाहता हूं।मल्टीकोर प्रोसेसर

कैमरे के काम को अन्य प्रोसेसर में ऑफ़लोड करने के लिए मुझे क्या करने की आवश्यकता है और मैं मुख्य एप्लिकेशन के साथ संचार कैसे संभाल सकता हूं?

संपादित करें: मैं विंडोज 7 64-बिट चला रहा हूं।

उत्तर

12

असल में, आपको अपने आवेदन को मल्टीथ्रेड करने की आवश्यकता है। निष्पादन के प्रत्येक धागे केवल एक कोर संतृप्त कर सकते हैं। अलग-अलग धागे अलग-अलग कोर पर चलते हैं। यदि आप जोर देते हैं कि प्रत्येक थ्रेड हमेशा एक विशिष्ट कोर पर निष्पादित होता है, तो प्रत्येक ऑपरेटिंग सिस्टम का यह निर्दिष्ट करने का अपना तरीका होता है (एफ़िनिटी मास्क & ऐसे) ... लेकिन मैं इसकी अनुशंसा नहीं करता।

ओपनएमपी बहुत अच्छा है, लेकिन यह गधे में एक तंग वसा है, खासकर जब समानांतरता से बैक अप लेना। YMMV। इसका उपयोग करना आसान है, लेकिन सभी बेहतरीन प्रदर्शन विकल्प पर नहीं। इसे कंपाइलर समर्थन की भी आवश्यकता है।

यदि आप मैक ओएस एक्स 10.6 (हिम तेंदुए) पर हैं, तो आप Grand Central Dispatch का उपयोग कर सकते हैं। इसके बारे में पढ़ना दिलचस्प है, भले ही आप इसका उपयोग न करें, क्योंकि इसकी डिज़ाइन कुछ सर्वोत्तम प्रथाओं को लागू करती है। यह इष्टतम नहीं है, लेकिन यह ओपनएमपी से बेहतर है, भले ही इसे कंपाइलर समर्थन की भी आवश्यकता हो।

यदि आप अपने काम को "कार्य" या "नौकरियों" में तोड़ने के आसपास अपने सिर को लपेट सकते हैं, तो आप इन नौकरियों को आपके पास कोर के रूप में कई पाइप नीचे डाल सकते हैं। काम की परमाणु इकाइयों के रूप में अपनी प्रसंस्करण बैचिंग के बारे में सोचें। यदि आप इसे सही तरीके से विभाजित कर सकते हैं, तो आप एक ही समय में अपने कोर प्रोसेसिंग को दोनों कोर, और अपने मुख्य थ्रेड पर चला सकते हैं।

यदि काम की प्रत्येक इकाई के लिए संचार कम किया जाता है, तो म्यूटेक्स और अन्य लॉकिंग प्राइमेटिव्स की आपकी आवश्यकता कम हो जाएगी। पाठ्यक्रम दागदार थ्रेडिंग ठीक दाग से ज्यादा आसान है। और, आप बोझ को कम करने के लिए हमेशा लाइब्रेरी या ढांचे का उपयोग कर सकते हैं। यदि आप मैन्युअल दृष्टिकोण लेते हैं तो Boost's Thread library पर विचार करें। यह पोर्टेबल रैपर और एक अच्छा अमूर्त प्रदान करता है।

1

आपको मल्टीकोरों को संभालने के लिए किसी प्रकार की ढांचे की आवश्यकता है। OpenMP एक काफी सरल विकल्प लगता है।

+2

आप केवल pthreads या जो भी ओएस पहले से ही प्रदान करते हैं, का उपयोग कर सकते हैं। – pestilence669

+1

@ महामारी - हाँ, हालांकि मैं क्रॉस-प्लेटफ़ॉर्म समाधान प्रस्तावित करने के लिए चिपक जाता हूं :) –

+0

lol। तब सिगविन पर pthreads! :) – pestilence669

2

मैं ओपनएमपी के खिलाफ अनुशंसा करता हूं, ओपनएमपी उपभोक्ता/निर्माता मॉडल के बजाय संख्यात्मक कोड के लिए अधिक है जो आपको लगता है।

मुझे लगता है कि आप श्रमिक थ्रेड, स्मृति के सामान्य खंड (अधिग्रहित डेटा के संचार के लिए) के लिए बूस्ट थ्रेड का उपयोग करके कुछ सरल कर सकते हैं, और आपके डेटा पर बताने के लिए कुछ अधिसूचना तंत्र उपलब्ध हैं (बूस्ट थ्रेड इंटरप्ट्स में देखें)।

मुझे नहीं पता कि आप किस तरह की प्रसंस्करण करते हैं, लेकिन आप इंटेल थ्रेड बिल्डिंग ब्लॉक और इंटेल एकीकृत प्राइमेटिव्स पर एक नज़र डालना चाहते हैं, उनके पास वीडियो प्रोसेसिंग के लिए कई फ़ंक्शन हैं जो तेजी से हो सकते हैं (मानते हैं कि उनके पास आपका है कार्यक्षमता)

+0

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

+0

एमपीआई इस मामले में अधिक व्यावहारिक होगा। विवरण जानने के बिना – tur1ng

+0

यह कहना मुश्किल है, लेकिन आम तौर पर मैं आपसे सहमत हूं। लिनक्स भूमि में सीपीयूसेट उपयोगिता है जो थ्रेड प्लेसमेंट को नियंत्रित करती है, हालांकि इसे स्वयं इस्तेमाल नहीं किया है। मेरी राय में एमपीआई एक ओवरकिल होगा, मुझे नहीं लगता कि श्री बेल कई नोड्स पर चलने का इरादा रखता है। – Anycorn

1

यह आपके कितने कोर पर निर्भर करता है। यदि आपके पास केवल 2 कोर हैं (सीपीयू, प्रोसेसर, हाइपरथ्रेड, आप जानते हैं कि मेरा क्या मतलब है), तो ओपनएमपी प्रदर्शन में इतनी जबरदस्त वृद्धि नहीं दे सकता है, लेकिन मदद करेगा।आपके पास अधिकतम लाभ प्रोसेसर की संख्या से अपना समय विभाजित कर सकता है, इसलिए यह प्रति फ्रेम 100 - 150 एमएस लेगा।

समीकरण है
समानांतर समय = (([एक कार्य करने के लिए कुल समय] - [कोड कि parallelized नहीं किया जा सकता])/[CPU की संख्या]) + [कोड कि parallelized नहीं किया जा सकता]

असल में, समानांतर लूप प्रसंस्करण पर ओपनएमपी चट्टानों। इसका उपयोग करना आसान है

#pragma omp parallel for 
for (i = 0; i < N; i++) 
    a[i] = 2 * i; 

और बैंग, आपका समांतर समानांतर है। यह हर मामले के लिए काम नहीं करता है, हर एल्गोरिदम को इस तरह समांतर नहीं किया जा सकता है लेकिन कई को संगत होने के लिए पुनः लिखा जा सकता है (हैक किया गया)। मुख्य सिद्धांत एकल निर्देश, एकाधिक डेटा (सिम) है, उदाहरण के लिए एक ही रूपांतरण कोड को एकाधिक पिक्सेल में लागू करना।

लेकिन बस इस कुकबुक रसीद को लागू करने के अनुकूलन के नियमों के खिलाफ चला जाता है।
1-बेंचमार्क अपने कोड
2-पता लगाएं "वैज्ञानिक" सबूत (संख्या) के साथ वास्तविक बाधाओं बस अनुमान लगा के बजाय जहां आपको लगता है एक टोंटी
3-यदि यह वास्तव में छोरों संसाधित कर रहा है, तो OpenMP आप के लिए है नहीं है

शायद आपके मौजूदा कोड पर सरल अनुकूलन बेहतर परिणाम दे सकते हैं, कौन जानता है?

एक और सड़क थ्रेड में ओपनगल चलाने और किसी अन्य धागे पर डेटा प्रोसेसिंग चलाने के लिए होगी। अगर ओपनग्ल या आपके कण प्रतिपादन प्रणाली में बहुत सारी शक्ति होती है, तो इससे बहुत मदद मिलेगी, लेकिन याद रखें कि थ्रेडिंग अन्य प्रकार की सिंक्रनाइज़ेशन बाधाओं का कारण बन सकती है।

0

क्या महामारी ने कहा, आपको बस अपने ऐप को बहुप्रचारित करने की आवश्यकता है। OpenMP तरह चौखटे के बहुत सारे उल्लेख किया गया है, इसलिए यहाँ एक और एक है:

Intel Thread Building Blocks

मैं इसे पहले कभी उपयोग नहीं किया है, लेकिन मैं इसके बारे में बड़े बड़े काम सुनते हैं।

आशा है कि इससे मदद मिलती है!

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