2011-01-22 7 views
15

यदि आप समसामयिक रूप से एकाधिक धागे (या प्रक्रियाओं) को बढ़ा रहे हैं, तो भौतिक प्रोसेसर या लॉजिकल प्रोसेसर की संख्या को समझना बेहतर है, यह मानते हुए कि यह कार्य CPU-बाध्य है? या क्या यह कुछ कहना है (कहें, 3 धागे)?ड्यूल-कोर हाइपरथ्रेडिंग: क्या मुझे 4 धागे या 3 या 2 का उपयोग करना चाहिए?

क्या प्रदर्शन निष्पादित किए जा रहे निर्देशों पर निर्भर करता है (कहें, क्या गैर-स्थानीय स्मृति पहुंच कैश हिट से बहुत अलग होगी)? यदि हां, तो हाइपरथ्रेडिंग का लाभ उठाने के लिए कौन सा मामला बेहतर है?


अद्यतन:

कारण मैं पूछ रहा हूँ, मैं कहीं पढ़ने कि यदि आप आभासी प्रोसेसर की संख्या के रूप में कई कार्यों को है, एक ही शारीरिक कोर पर कार्य कभी कभी कुछ सीपीयू को भूखा कर सकते हैं याद संसाधनों और एक दूसरे को आवश्यकतानुसार संसाधनों को कम करने, संभावित रूप से कम करने से रोकने के लिए रोकें। यही कारण है कि मैं सोच रहा हूं कि वर्चुअल कोर के रूप में कई धागे होने का एक अच्छा विचार है।

उत्तर

5

प्रदर्शन कारकों की एक विशाल विविधता पर निर्भर करता है। अधिकांश कार्य सख्ती से CPU बाध्य नहीं होते हैं, भले ही सभी डेटा स्मृति में हों, यह आमतौर पर प्रोसेसर कैश में ऑन-बोर्ड नहीं होता है। मैंने उदाहरण देखा है (जैसे this one) जहां मेमोरी एक्सेस पैटर्न किसी दिए गए 'समांतर' प्रक्रिया के प्रदर्शन प्रोफ़ाइल को नाटकीय रूप से बदल सकते हैं।

संक्षेप में, सभी स्थितियों के लिए कोई सही संख्या नहीं है।

+0

+1 वह लिंक बहुत जानकारीपूर्ण है; धन्यवाद! – Mehrdad

2

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

अधिक हाइपरथ्रेडिंग खुद के बारे में जानकारी कर रहे हैं विभाजित कर सकते हैं here

+0

+1 दिलचस्प ... मैं हिंदुस्तान टाइम्स पर अन्य इंटेल प्रलेखन पढ़ा था लेकिन यह एक अंतर है और एक बहुत अधिक जानकारी नहीं है; धन्यवाद! – Mehrdad

+0

लिंक अब 404 है। – user643011

4

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

दूसरी ओर, कोर आईएक्स प्रोसेसर के साथ जिसमें टर्बो बूस्ट है, आप वास्तव में सीपीयू को ओवरक्लॉक करने के लिए प्रोत्साहित करने के लिए 1 कोर प्रति कोर बेहतर प्रदर्शन कर सकते हैं।

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

मान लें कि 2 × कोर शुरू करने के लिए एक अच्छी जगह है, लेकिन नीचे की रेखा है: उपाय!

+0

+1 टर्बो बूस्ट सुविधा को इंगित करने के लिए धन्यवाद ... मेरे पास यह मेरे अपने सीपीयू पर है लेकिन मैंने कभी सोचा नहीं था कि यह समीकरण के हिस्से को कैसे प्रभावित कर सकता है। – Mehrdad

+1

हाइपर थ्रेडिंग के साथ प्रदर्शन सुधार प्राप्त करने के बीच में कोई संबंध है, और यह इस तथ्य से संबंधित है कि कैश आकार कम हो गए हैं - यदि आपकी कैश हिट दरें पर्याप्त हैं, तो कैश आकार का नुकसान रद्द नहीं होता है (या बदतर) दो हार्डवेयर धागे होने से लाभ। –

2

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

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

दुर्भाग्यवश, मुझे शेड्यूलर को किसी भी संकेत देने का कोई तरीका नहीं पता है कि कुछ थ्रेड को संभव होने पर कोर साझा करना चाहिए, जबकि अन्य संभव होने पर अलग से चलना चाहिए।

+0

आप थ्रेड के लिए प्रोसेसर एफ़िनिटी सेट कर सकते हैं, यह एक संकेत से बेहतर है। –

+2

@ChrisO: हाँ, लेकिन एक असली "संकेत" तंत्र यह कहने में सक्षम होगा कि "थ्रेड एक्स को वही कोर को थ्रेड वाई के रूप में साझा करना चाहिए", जबकि शेड्यूलर को यह तय करने की इजाजत दी जा रही है कि * जो * कोर किसी भी दिए गए पर साझा करेगा पल। – supercat

+0

हां, मुझे अब यह मिल गया है, संकेत वास्तव में हार्डकोडेड कोर # से बेहतर होगा। –

0

अन्य सभी उत्तरों पहले से ही बहुत सारी उत्कृष्ट जानकारी देते हैं। लेकिन, एक और बात यह है कि सिम इकाई को उसी मर पर तार्किक कोर के बीच साझा किया जाता है। इसलिए, यदि आप एसएसई कोड के साथ धागे चला रहे हैं, तो क्या आप उन्हें सभी 4 लॉजिकल कोर पर चलाते हैं, या केवल 2 थ्रेड स्पॉन करते हैं (मानते हैं कि आपके पास दो चिप्स हैं)? इस अजीब मामले के लिए, अपने ऐप के साथ प्रोफाइल करना सबसे अच्छा है।

1

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

आखिरी मामले में, एक थ्रेड चलाने से अधिकतम एक साथ सैद्धांतिक प्रसंस्करण शक्ति (10-30% तक) कम हो जाएगी, बिना किसी थ्रेड को चलाने के पक्ष में कैश थ्रैशिंग की मंदी के बिना जो कुछ अनुप्रयोगों में बहुत महत्वपूर्ण हो सकता है।

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

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

http://en.wikipedia.org/wiki/Thrashing_(computer_science) http://en.wikipedia.org/wiki/Processor_affinity

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

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