जैसा कि @ बाइल टिप्पणियों में उल्लेख करता है, यह अत्यधिक एप्लिकेशन, सिस्टम, पर्यावरण-विशिष्ट है।
और इस तरह, मैं प्रत्येक कोर के लिए बिल्कुल 1 धागे का उल्लेख करने के हार्ड लाइन दृष्टिकोण नहीं ले रहा हूं। (या हाइपरथ्रेडिंग के मामले में 2 धागे/कोर)
एक अनुभवी साझा-मेमोरी प्रोग्रामर के रूप में, मैंने अपने अनुभव से देखा है कि थ्रेड (4 कोर मशीन के लिए) इष्टतम # 1 से 64 तक कहीं भी हो सकता है +।
अब मैं स्थितियों है कि इस रेंज का कारण बन सकती करके बताना होगा:
इष्टतम धागे < कोर की #
कुछ कार्यों कि अत्यंत सूक्ष्म कर रहे हैं (जैसे छोटे FFTs के रूप में) के समानांतर में, थ्रेडिंग का ओवरहेड प्रमुख प्रदर्शन कारक है। कुछ मामलों में, यह समानांतर करने में सहायक नहीं है। कुछ मामलों में, आप 2 थ्रेड के साथ स्पीडअप प्राप्त करते हैं, लेकिन पीछे 4 धागे पर स्केलिंग करते हैं।
एक और मुद्दा संसाधन विवाद है। यहां तक कि यदि आपके पास अत्यधिक समानांतर कार्य है जो आसानी से 4 कोर/धागे में विभाजित हो सकता है, तो आप मेमोरी बैंडविड्थ और कैश प्रभावों से बाधित हो सकते हैं। अक्सर, आप पाते हैं कि 2 धागे 4 धागे जितना तेज़ होंगे।कोर
की
इष्टतम धागे = # यह इष्टतम मामला है (यदि अक्सर बहुत बड़ी FFTs के मामले में)। यहां व्याख्या करने की कोई आवश्यकता नहीं - प्रति कोर एक धागा। सबसे शर्मनाक समानांतर अनुप्रयोग जो मेमोरी या आई/ओ बाध्य नहीं हैं यहां ठीक हैं।
इष्टतम धागे> कोर
यह जहां यह दिलचस्प ... बहुत दिलचस्प हो जाता है है की #। क्या आपने लोड असंतुलन के बारे में सुना है? ओवर-अपघटन और काम-चोरी के बारे में कैसे?
कई समानांतर अनुप्रयोग अनियमित होते हैं - जिसका अर्थ है कि कार्य बराबर आकार के उप-कार्यों में विभाजित नहीं होते हैं। तो यदि आप एक बड़े कार्य को 4 असमान आकार में विभाजित कर सकते हैं, तो उन्हें 4 धागे तक असाइन करें और उन्हें 4 कोर पर चलाएं ... परिणाम? खराब समानांतर प्रदर्शन क्योंकि 1 धागा अन्य धागे की तुलना में 10x अधिक काम प्राप्त हुआ।
पर एक सामान्य समाधान पर कई उप-कार्यों में कार्य को विघटित करना है। आप या तो उनमें से प्रत्येक के लिए धागे बना सकते हैं (इसलिए अब आप धागे >>कोर) प्राप्त कर सकते हैं। या आप किसी निश्चित प्रकार के थ्रेड के साथ कुछ प्रकार के कार्य-शेड्यूलर का उपयोग कर सकते हैं। सभी कार्य दोनों के लिए अनुकूल नहीं हैं, इसलिए अक्सर, 4-कोर मशीन के लिए 8 या 16 धागे के लिए एक कार्य को अधिक से अधिक विघटन करने का दृष्टिकोण इष्टतम परिणाम देता है।
हालांकि अधिक धागे पैदा करने से बेहतर लोड-बैलेंस हो सकता है, ओवरहेड बनता है। तो आमतौर पर कहीं इष्टतम बिंदु है। मैंने 4 कोर पर 64 धागे के रूप में उच्च देखा है। लेकिन जैसा कि बताया गया है, यह अत्यधिक आवेदन विशिष्ट है। और आपको प्रयोग करने की ज़रूरत है।
संपादित करें: का जवाब विस्तार और सीधे सवाल का जवाब ...
संदर्भ स्विचिंग की लागत क्या है? स्टोर के लिए समय और सीपीयू अलग-अलग संदर्भ के लिए पुनर्स्थापित करता है?
यह पर्यावरण पर बहुत निर्भर है - और सीधे मापने में कुछ मुश्किल है।
लघु जवाब: बहुत महंगाThis might be a good read.
क्या कैश, पाइपलाइनों और CPU के अंदर विभिन्न कोड-भविष्यवाणी चीजों के बारे में? क्या हम कह सकते हैं कि प्रत्येक बार जब हम संदर्भ बदलते हैं, तो हमने सीपीयू, पाइपलाइनों और सीपीयू में कुछ कोड-डिकोडिंग सुविधाओं को नुकसान पहुंचाया है?
लघु जवाब: हाँ जब आप संदर्भ बाहर स्विच, आप की संभावना अपने पाइपलाइन और गंदगी सब भविष्यवक्ताओं फ्लश। कैश के साथ ही। नया धागा नए डेटा के साथ कैश को प्रतिस्थापित करने की संभावना है।
हालांकि एक पकड़ है। कुछ अनुप्रयोगों में जहां धागे एक ही डेटा साझा करते हैं, यह संभव है कि एक थ्रेड एक ही आने वाले धागे या अन्य थ्रेड के लिए कैश को "गर्म" कर सकता है, जो एक ही कैश को साझा करने वाले एक अलग कोर पर हो सकता है।(हालांकि दुर्लभ, मैंने देखा है यह मेरा NUMA मशीनों में से एक पर पहले हो - superlinear speedup:?!?! 16 कोर के पार 17.6x)
तो अधिक एक सिंगल कोर पर क्रियान्वित करने सूत्र, कम काम वे अपने सीरियल निष्पादन की तुलना में एक साथ कर सकते हैं?
निर्भर करता है, निर्भर करता है ... एक तरफ हाइपरथ्रेडिंग, निश्चित रूप से ओवरहेड होगा। लेकिन मैंने एक पेपर पढ़ा है जहां किसी ने मुख्य थ्रेड के लिए प्रीफेच करने के लिए दूसरा थ्रेड इस्तेमाल किया है ... हाँ यह पागल है ...
उत्तर भारी आवेदन है, सिस्टम-, और मशीन-विशिष्ट। लेकिन यह शायद 4 से बड़ा है, लेकिन 50 से कम धागे। क्या आपने 4, 6, 8, 10 धागे के साथ मापने की कोशिश की? –
4 धागे (या 8 डब्ल्यू/हाइपर थ्रेडिंग)। कम डेटा भाग। बेहतर कैश गुण। – bestsss