2014-09-11 6 views
5

सभी पूरी तरह सैद्धांतिक हैं, प्रश्न अभी दिमाग में आया है और मुझे पूरा यकीन नहीं था कि उत्तर क्या है:क्या एक बहु-थ्रेडेड एप्लिकेशन वास्तव में एकल-थ्रेडेड एप्लिकेशन से तेज होगा?

मान लें कि आपके पास एक ऐसा एप्लिकेशन है जो 4 स्वतंत्र गणनाओं की गणना करता है। (पूरी तरह से स्वतंत्र, कोई फर्क नहीं पड़ता कि आप उन्हें क्या आदेश देते हैं और आपको किसी की गणना करने की आवश्यकता नहीं है)। इसके अलावा मान उन गणना लंबी (मिनट) और सीपीयू बाध्य

1) (आईओ के किसी भी प्रकार के लिए इंतजार नहीं) अब कर रहे हैं, यदि आप एक 1 प्रोसेसर कंप्यूटर है, किसी एकल थ्रेड आवेदन तार्किक तेजी से हो जाएगा एक बहुप्रचारित आवेदन (या जैसा) के मुकाबले। चूंकि कंप्यूटर एक प्रोसेसर के साथ एक समय में एक चीज करने में सक्षम नहीं होता है, इसलिए यह संदर्भ स्विचिंग और पसंदों पर समय बर्बाद कर देगा। अभी तक इतना अच्छा है?

2) यदि आप एक 4 प्रोसेसर कंप्यूटर हैं, तो 4 धागे ज्यादातर संभावना तेजी से एकल थ्रेड की तुलना में इस के लिए किया जाएगा। सही? आपका कंप्यूटर अब एक समय में 4 संचालन कर सकता है, इसलिए यह आपके आवेदन को 4 धागे में विभाजित करने के लिए तार्किक है, और इसे 4 गणनाओं में से सबसे लंबे समय तक पूरा करना चाहिए। अभी तक अभी तक अच्छा है?

3) और अब वास्तविक भाग मैं उलझन में हूं - मैं अपने आवेदन को प्रोसेसर की संख्या (वास्तव में - कोर) की तुलना में अधिक धागे क्यों बना सकता हूं? मैंने प्रोग्राम किए और उन अनुप्रयोगों को देखा जो दसियों और सैकड़ों धागे बनाते हैं, लेकिन असल में - औसत कंप्यूटर औसत कंप्यूटर के लिए लगभग 8 है?

पीएस मैंने पहले ही यह पढ़ा है: Threading vs single thread लेकिन इसका जवाब शांत नहीं हुआ।

चीयर्स

+0

इसी प्रकार का प्रश्न: http://stackoverflow.com/questions/503551/does-it-make-sense-to-spawn-more-than-one-thread-per-processor – user2314737

उत्तर

1

मुझे लगता है कि आप मानते हैं कि सभी कार्यक्रमों सीपीयू बाध्य कर रहे हैं - याद अपने धागे से कुछ आई/ओ (डिस्क/नेटवर्क/उपयोगकर्ता यातायात) के लिए इंतजार कर रहे होंगे।

+0

आप पूरी तरह से सही हैं, उन गणनाओं को मानें सीपीयू-बाध्य हैं और आईओ-बाध्य नहीं हैं, तो क्या? – AlexD

+1

किस मामले में आपको कम से कम कोर के रूप में विवाद/संदर्भ स्विचिंग से बचने के लिए धागे के रूप में लाभ होगा। समस्या यह है कि पीसी पर अन्य प्रक्रियाएं होंगी जैसे कि ओएस जो सीपीयू का उपयोग करना चाहती है, इसलिए इसे पूरी तरह से टाला नहीं जा सकता है। –

+1

मुझे लगता है कि यह "आई/ओ" के रूप में बेहतर वाक्यांश होगा। विशेष रूप से, सीपीयू स्मृति की तुलना में काफी तेज़ होते हैं, जो मुख्य स्मृति से एक आई/ओ ऑपरेशन के रूप में पढ़ने के बारे में सोचने के लिए समझ में आता है, और स्मृति प्रतिक्रिया के दौरान सीपीयू को कुछ करने की कोशिश करता है। यह हाइपरथ्रेडिंग के साथ विशेष रूप से सच है, जहां आप एक और धागा बहुत जल्दी चलाने के लिए तैयार हो सकते हैं। –

1

एक कारण मैं कोर की तुलना में अधिक धागे के लिए आ सकता हूं अगर कुछ धागे को अन्य पार्टियों के साथ इंटरफेस करने की आवश्यकता होती है ... सर्वर से प्रतिक्रिया की प्रतीक्षा कर रहा है .. डेटाबेस से कुछ पूछताछ। यह थ्रेड को तब तक सोने की अनुमति देगा जब तक कोई उत्तर प्रदान नहीं किया जाता है। इस तरह अन्य गणनाओं को इंतजार नहीं करना पड़ेगा। 4cores-> चौथा धागा इनपुट के लिए इंतजार करेगा जो संभावित रूप से अन्य कोड को भी

1

अपने आवेदन में धागे जोड़ना प्रदर्शन लाभ के बारे में सख्ती से नहीं है। कुछ बार आप एक ही समय में एक से अधिक कार्य करना चाहते हैं या आपके प्रोग्राम को आर्किटेक्ट करने का सबसे तार्किक तरीका है।

उदाहरण के तौर पर, यदि आप बहु-थ्रेडेड दृष्टिकोण लेते हैं, तो शायद आप एक गेम इंजन लिख रहे हैं, आपके पास भौतिकी के लिए एक धागा हो सकता है, ग्राफिक्स के लिए एक थ्रेड, नेटवर्किंग के लिए एक थ्रेड, उपयोगकर्ता इनपुट के लिए एक थ्रेड, एक डिस्क आदि से संसाधन लोडिंग के लिए धागा

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

5

प्रोसेसर की संख्या (वास्तव में वास्तव में - कोर) की तुलना में मेरे आवेदन को और अधिक धागे क्यों बनाएंगे?

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

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

यह एक सरलीकृत उदाहरण है, लेकिन मेरे उत्पादन में मौजूद कार्यक्रमों के समान ही है।

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

आपकी सर्वश्रेष्ठ शर्त, निश्चित रूप से, एक परीक्षण स्थापित करना है। 4-कोर मशीन पर, 1, 2, 3, 4, 5, ... थ्रेड के साथ अपने ऐप का परीक्षण करें। विभिन्न धागे के साथ पूरा करने में कितना समय लगता है। मुझे लगता है कि आप पाएंगे कि 4-कोर मशीन पर मीठा स्थान 3 या 4 होगा; सबसे अधिक संभावना 4 जब तक अन्य ऐप्स या ओएस सेवाएं न हों जो बहुत सारे CPU लेते हैं।

+0

मैं जेम्स बैक्सटर से पूछे गए प्रश्न को पुनर्निर्देशित करूंगा: मान लें कि असंबद्ध-बफर है या सिर्फ मेरे प्रोग्राम सीपीयू-बाध्य हैं (मुझे लगता है कि वास्तविक जीवन अनुप्रयोगों में कभी ऐसा मामला नहीं है)। उस काल्पनिक मामले में और मानते हुए कि मैं एकमात्र एप्लिकेशन चला रहा हूं, क्या कोर की तुलना में अधिक धागे बनाने में कोई समझ है? – AlexD

+0

@AlexD: मेरी अद्यतन प्रतिक्रिया देखें। –

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