2011-05-13 10 views
7

मैंने एक बहुप्रचारित संस्करण में पेजरैंक का एक संस्करण लागू किया है। मैं इसे 4-कोर Q6600 पर चला रहा हूं। जब मैंने इसे 4 धागे बनाने के लिए सेट चलाने के लिए, मैं:कोरों की तुलना में अधिक थ्रेड क्यों है?

real 6.968s 
user 26.020s 
sys  0.050s 

मैं जब मैं 128 धागे के साथ चलाएँ:

real 0.545s 
user 1.330s 
sys  0.040s 

यह मेरे लिए कोई मतलब नहीं है। मूल एल्गोरिदम एक योग-कम है:

  1. सभी थ्रेड इनपुट का सबसेट है;
  2. सिंक्रनाइज़ करें;
  3. प्रत्येक धागा तब अन्य धागे से परिणामों का हिस्सा जमा करता है;
  4. मुख्य धागा सभी धागे से एक मध्यवर्ती मूल्य निर्धारित करता है और फिर निर्धारित करता है कि जारी रखना है या नहीं।

रूपरेखा नहीं मदद की है। मुझे यकीन नहीं है कि मेरे कोड को समझने के लिए कौन सा डेटा उपयोगी होगा - कृपया पूछें।

यह वास्तव में मुझे परेशान है।

+0

इस मामले में इनपुट क्या है? कुछ आईओ-बाध्य? क्या आपके पास प्रत्येक व्यक्तिगत चरण के लिए माप है? –

+0

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

+0

इनपुट सभी शुरुआत में पढ़ा जाता है, इसलिए आईओ बाध्य नहीं है। मैं बहु-थ्रेडिंग कोड का एक बड़ा हिस्सा पुनः लिखता हूं और झूठी साझाकरण का एक उदाहरण हटा देता हूं। झूठी-साझाकरण फिक्स ने गति को थोड़ा बढ़ा दिया। – laurencer

उत्तर

10

जानबूझकर प्रोसेसर की तुलना में अधिक धागे बनाने के लिए एक मानक तकनीक है जो "अतिरिक्त चक्र" का उपयोग करने के लिए प्रयोग की जाती है जहां थ्रेड को किसी चीज की प्रतीक्षा करने के लिए अवरुद्ध किया जाता है, चाहे वह I/O, mutex, या कुछ अन्य उपयोगी काम प्रदान करके कुछ और हो प्रोसेसर के लिए करने के लिए।

यदि आपके धागे I/O कर रहे हैं तो यह गति-अप के लिए एक मजबूत दावेदार है: क्योंकि प्रत्येक थ्रेड ब्लॉक I/O के लिए प्रतीक्षा कर रहा है, प्रोसेसर अन्य थ्रेड चला सकता है जब तक कि वे I/O के लिए भी अवरुद्ध न हों , उम्मीद है कि किस समय से पहले धागे के लिए डेटा तैयार है, और बहुत आगे।

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

+3

झूठी साझाकरण के बारे में अनुमान एक बहुत अच्छा है। लेकिन रन टाइम में भारी अंतर पर विचार करते हुए, मुझे काम विभाजन तर्क में रेस कंडीशन बग पर संदेह है, ताकि कई धागे वाले संस्करण कुछ नौकरियों को "भूल जाए" और दूसरे के जितना ज्यादा नहीं करते हैं। – Ringding

6

आप शायद अतिरिक्त CPU चक्र है, जबकि स्मृति जैसे कुछ संसाधनों के लिए धागा ब्लॉक। इन CPU चक्रों का उपयोग अन्य धागे द्वारा किया जा सकता है। जिस डेटा को मैं देखता हूं वह है ... क्या 4 थ्रेड संस्करण प्रत्येक कोर का 100% उपयोग दिखाता है? यदि नहीं, तो आपको अपने अतिरिक्त CPU चक्र मिल गए हैं।

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

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