2010-03-30 13 views
9

क्वाड कोर प्रोसेसर के सभी कोर का उपयोग करने के लिए मुझे अपने कोड में बदलने की क्या ज़रूरत है, यह बहु थ्रेडिंग का समर्थन जोड़ने के बारे में है या यह ओएस द्वारा स्वयं की देखभाल की जाती है। मेरे पास फ्रीबीएसडी और भाषा है जिसका मैं उपयोग कर रहा हूं वह सी ++ है। मैं अपने आवेदन के लिए कम से कम 90% पूर्ण CPU चक्र देना चाहता हूं।आवेदन में क्वाड कोर सीपीयू का उपयोग कैसे करें

+9

चेतावनी दी जानी चाहिए। थ्रेडिंग एक सिरदर्द है और मौजूदा अनुप्रयोग में थ्रेडिंग समर्थन जोड़ना और भी बदतर है। – Yacoby

+7

अक्सर, 4-कोर CPU का उपयोग करने का सबसे आसान तरीका आपके प्रोग्राम की 4 प्रतियां चलाने के लिए है। यदि यह आपके डेटास्ट्रक्चर के कारण अप्रचलित है, तो संभावना है कि सभी थ्रेड समाधान सुझाए जाएंगे। – MSalters

+1

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

उत्तर

11

सी ++ में बहु-थ्रेडेड अनुप्रयोगों के लिए मैं Boost.Thread सुझा सकता हूं जो आपको अपनी क्वाड-कोर मशीन की पूरी क्षमता तक पहुंचने में मदद कर सकता है।

अपना कोड बदलने के लिए, आप चीजों को यथासंभव अपरिवर्तनीय बनाने पर विचार करना चाहेंगे। धागे के बीच राज्य संक्रमण डीबग करना ज्यादा कठिन होता है। ऐसी चीजें हैं जो अप्रत्याशित तरीकों से संभावित रूप से हो सकती हैं। this SO धागा देखें।

3

मुझे लगता है कि आपका एकमात्र विकल्प कई धागे चलाने के लिए है। यदि आपका एप्लिकेशन एकल-थ्रेडेड है, तो यह केवल कोरों में से एक (एक समय में) पर चलता है, लेकिन यदि आपके पास अधिक धागे हैं, तो वे एक साथ चल सकते हैं।

+1

जैसा कि बताया गया है, एक और विकल्प एक ही कार्यक्रम की कई प्रतियां चलाएं। समस्या की प्रकृति के आधार पर, यह आसान हो सकता है या नहीं भी हो सकता है (http://en.wikipedia.org/wiki/Embarrassingly_parallel देखें)। – KeithB

1

आपको थ्रेडिंग के उपयोग के माध्यम से समांतरता के लिए अपने आवेदन में समर्थन जोड़ने की आवश्यकता है।

एक बार जब आप समांतरता के लिए समर्थन प्राप्त कर लेते हैं, तो यह आपके थ्रेड को CPU कोर को असाइन करने के लिए ओएस पर निर्भर करता है।

10

एक और विकल्प यहां उल्लिखित नहीं है, अलग-अलग थ्रेडिंग, -fopenmp और libgomp लाइब्रेरी के माध्यम से उपलब्ध ओपनएमपी का उपयोग है, जिसमें से मैंने अपने फ्रीबीएसडी 8 सिस्टम पर स्थापित किया है।

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

इस पर एक नज़र डालें: https://computing.llnl.gov/tutorials/openMP/

धागे का उपयोग कर के रूप में/खुद को, कुछ दिनचर्या और इसे करने के लिए खुद को उधार देने के काम करने के तरीके संसाधित करता है। क्या आप इस तरह से कार्यों को तोड़ सकते हैं? क्या यह आपकी प्रक्रिया कांटा() को समझता है या धागा बनाता है? यदि ऐसा है, तो ऐसा करें, लेकिन यदि नहीं, तो अपने आवेदन को बहु-थ्रेडेड होने के लिए मजबूर करने की कोशिश न करें क्योंकि। एक उदाहरण जो मैं आमतौर पर देता हूं वह सबसे बड़ा आम विभाजक एल्गोरिदम है - यह परंपरागत कार्यान्वयन में हर समय पहले कदम पर निर्भर करता है इसलिए समानांतर बनाना कठिन होता है।

यह भी ध्यान दें कि यह अच्छी तरह से ज्ञात है कि कुछ एल्गोरिदम के लिए, समानांतर में जो कुछ भी आप कर रहे हैं, उसके समानांतर मूल्य समान रूप से धीमे होते हैं, क्योंकि नौकरियां अधिक तेज़ी से पूर्ण होती हैं, लेकिन समय-समय पर फंसे हुए और जुड़ने की लागत या प्रक्रियाओं) वास्तव में एक धारावाहिक कार्यान्वयन के ऊपर समय को धक्का देता है।

19

आप need समांतरता के कुछ रूप हैं। बहु थ्रेडिंग या बहु-प्रसंस्करण ठीक होगा।

आमतौर पर, कई धागेआसान कई से संभाल करने के लिए (क्योंकि वे साझा डेटा का उपयोग कर सकते हैं) प्रक्रियाओं हैं। हालांकि, आमतौर पर, एकाधिक धागेहार्ड हैंडल करने के लिए (क्योंकि वे साझा डेटा तक पहुंचते हैं) एकाधिक प्रक्रिया से अधिक हैं। और, हाँ, मैंने जानबूझकर यह लिखा था।

यदि आपके पास सिम परिदृश्य है, तो Ninefingers' suggestion ओपनएमपी देखने के लिए भी बहुत अच्छा है। (यदि आपको पता नहीं है कि सिमडी का क्या अर्थ है, तो नीचे निनफिंगर्स की सहायक टिप्पणी देखें।)

+0

आत्म-विरोधाभास जानबूझकर था? मैं सहमत हूं, दोनों कांटा() और थ्रेडिंग के फायदे/नुकसान हैं। –

+1

मैंने ऐसा सोचा। +1। आत्म-विरोधाभास के लिए –

+4

+1 :-) – Sebastian

0

पहली बात जो मुझे लगता है कि आपको देखना चाहिए कि क्या आपका एप्लिकेशन और उसके एल्गोरिदम पेरेलेल में निष्पादित करने के लिए उपयुक्त हैं (या संभवतः धारावाहिक कार्यों का एक सेट जिसे स्वतंत्र रूप से संसाधित किया जा सकता है)। यदि ऐसा नहीं है, तो इसे मल्टीथ्रेड करना या समांतर प्रक्रियाओं में इसे तोड़ना मुश्किल होगा, और आपको जिस तरह से काम करता है उसे संशोधित करने की आवश्यकता हो सकती है।

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

बूस्ट। यदि आप बहु-थ्रेडेड मार्ग पर जाने का निर्णय लेते हैं तो एक अच्छी लाइब्रेरी है।

2

मैं अपने आवेदन के लिए कम से कम 90% पूर्ण CPU चक्र देना चाहता हूं।

क्यों? आपकी चिप पर्याप्त गर्म नहीं है?

गंभीरता से, यह दुनिया विशेषज्ञों दर्जनों लेता है, तो घंटे के सैकड़ों नहीं parallelize और लोड संतुलन एक आवेदन इतना है कि यह सभी चार केंद्रों के 90% का उपयोग करता है। आपका सीपीयू पहले से ही के लिए चुकाया गया है और यह वही खर्च करता है चाहे आप इसका इस्तेमाल करते हों या नहीं। (असल में, अगर आप इसका उपयोग नहीं करते हैं, तो इसे चलाने के लिए थोड़ा कम खर्च होता है।) आपका समय कितना लायक है? संसाधन के अधिक प्रभावी उपयोग के लिए आप कितने घंटे निवेश करने के इच्छुक हैं, जिसकी लागत $ 300 हो सकती है और शायद वैसे भी निष्क्रिय रहती है?

समांतरता के माध्यम से गति प्राप्त करना संभव है, लेकिन यह मानव समय में महंगा है। इसे उचित ठहराने के लिए आपको एक अच्छे कारण की आवश्यकता है। (सीखना एक अच्छा पर्याप्त कारण है।)

समांतर प्रोग्रामिंग पर मुझे पता है कि सभी अच्छी किताबें सी ++ के अलावा अन्य भाषाओं के लिए हैं, और अच्छे कारण के लिए। यदि आप समांतरता पर दिलचस्प सामान चाहते हैं तो पीएच या एमएल या Fortress Project में समवर्ती प्रोग्रामिंग में लागू समानांतर प्रोग्रामिन देखें।

+0

कोई भी जवाब नहीं पढ़ रहा है "मैं मल्टीकोर का लाभ कैसे ले रहा हूं" के जवाब से आश्चर्यचकित होगा http://stackoverflow.com/questions/363341/how-are-you-taking-advantage-of-multicore :-) –

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