2009-03-07 14 views
6

मैंने एक बहु थ्रेडेड प्रोग्राम लिखा है जो कुछ सीपीयू भारी गणना करता है जिसमें बहुत सारे फ्लोटिंग पॉइंट ऑपरेशंस हैं। अधिक विशेष रूप से, यह एक ऐसा प्रोग्राम है जो फ्रेम द्वारा एनीमेशन अनुक्रम फ्रेम की तुलना करता है। अर्थात। यह एनीमेशन ए में सभी फ्रेम के लिए एनीमेशन बी में सभी फ्रेम के साथ एनीमेशन ए से फ्रेम फ्रेम की तुलना करता है। मैं इस तरह के गहन ऑपरेशन को समानांतर में विभिन्न एनिमेशन के लिए करता हूं, इसलिए प्रोग्राम एबी जोड़ी, बीसी जोड़ी और सीए जोड़ी पर काम कर सकता है समानांतर। कार्यक्रम QtConcurrent और एक "मानचित्र" फ़ंक्शन का उपयोग कर रहा है जो फ़ंक्शन पर गति वाले कंटेनर को मानचित्र करता है। QtConcurrent मेरे लिए थ्रेड पूल प्रबंधित करता है, मैं इंटेल क्वाड कोर प्रोसेसर पर काम कर रहा हूं ताकि यह 4 धागे पैदा कर सके।किसी प्रोग्राम के CPU उपयोग को कैसे कम करें?

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

+0

यह सबसे स्पष्ट जवाब है ... लेकिन, जैसा कि मैंने कहा, कुछ जटिल मानक और कंप्यूटर गेम मेरा पीसी दुर्घटना कभी नहीं। वे मेरे पीसी को कभी दुर्घटना क्यों नहीं करते? – sneg

+0

sneg: क्योंकि चश्मा इसके लिए डिजाइन किया गया था परे अपने कंप्यूटर (या कुछ भी) चलाने के बारे में एक बहुत मौलिक तथ्य की: परिणाम * अप्रत्याशित हैं *। कोई भी परीक्षण आपके कंप्यूटर की स्थिरता की गारंटी नहीं दे सकता है। डाउनक्लॉक और देखें कि क्या समस्या ठीक हो जाती है। यह सबसे अधिक संभावना है। – jalf

+0

सरल उत्तर, आप कितने अन्य प्रोग्राम चलाते हैं जो सीपीयू चलाते हैं और आपके कंप्यूटर की अधिकांश मेमोरी 100% पर विस्तारित अवधि के लिए चलाते हैं? संभावना है, कोई नहीं। –

उत्तर

5

यहां कुछ उत्कृष्ट उत्तर हैं।

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

एक लंबी दूरी की ऑटो दौड़ के साथ एक सादृश्य बनाने के लिए, वहाँ जीतने की कोशिश करने के दो तरीके हैं:

  1. बनाओ कार जाना तेजी
  2. कम बंद हो जाता है और बगल की यात्राओं
बनाओ

मेरे अनुभव में, लिखा पहले के रूप में सबसे सॉफ्टवेयर काफी जहाँ तक सॉफ्टवेयर बड़े हो जाता है सबसे सीधा रास्ता, विशेष रूप से लेने से है।

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

प्रदर्शन की समस्याओं को खोजने के लिए लोकप्रिय तरीका प्रोफाइलर उपयोग करने के लिए है।

हालांकि, मैं यह एक बहुत कुछ कर, और मेरे विधि यह है: http://www.wikihow.com/Optimize-Your-Program%27s-Performance

+0

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

+0

एक अच्छे प्रश्न के लिए धन्यवाद। दुनिया को संक्रमित करने के प्रदर्शन के बारे में मूर्ख विचार हैं, और आपका प्रश्न प्रकाश डालता है। –

9

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

यह कुछ प्रकार की अजीब मेमोरी-बग भी हो सकता है जहां आप अपनी रैम को ऐसे तरीके से भ्रष्ट कर सकते हैं जहां विंडोज (मुझे लगता है कि बीएसओडी की वजह से ओएस) अब ठीक नहीं हो सकता है (बहुत ही असंभव है, लेकिन कौन जानता है)।

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

लेकिन पहली बार में, मैं overclocking के मुद्दे पर देखने होगी ...

+0

"मुझे लगता है कि ओएस, बीएसओडी की वजह से": नाम की वजह से, है ना? ऐसा नहीं है कि यह दुर्घटनाग्रस्त हो गया? : डी –

+0

बीएसओडी = ब्लू स्क्रीन ऑफ डेथ, ज्यादातर विंडोज ऑपरेटिंग सिस्टम पर नीली त्रुटि-स्क्रीन के लिए उपयोग की जाती है, इसलिए मैंने नाम के कारण विंडोज का अनुमान लगाया। क्रैशिंग व्यवहार इन स्थितियों के तहत विंडोज के लिए कोई अच्छा संकेतक नहीं होगा क्योंकि हार्डवेयर को इसकी सीमाओं से परे संचालित होने पर हर ओएस क्रैश हो जाएगा। – Kosi2801

-1

मैं जब कर्नेल स्मृति क्षेत्र दूषित हो जाता है मौत का नीला स्क्रीन के कारण होता है लगता है। तो समानांतर संचालन करने के लिए मल्टीथ्रेडिंग का उपयोग करने का कारण नहीं हो सकता है।

ठीक है अगर आप भारी फ़्लोटिंग पॉइंट ऑपरेशंस लेते हुए कई धागे बना रहे हैं तो निश्चित रूप से आपका सीपीयू उपयोग 100% तक पहुंच जाएगा।

यदि आप प्रत्येक थ्रेड में कुछ नींद दे सकते हैं तो बेहतर होगा ताकि अन्य प्रक्रिया को कुछ मौका मिले। आप थ्रेड की प्राथमिकता को कम करने का भी प्रयास कर सकते हैं।

1

हार्डवेयर को दोष देना बहुत आसान है। मैं सुझाव दूंगा कि आप अपने प्रोग्राम को एक अलग सिस्टम पर चलाने का प्रयास करें और देखें कि यह उसी डेटा के साथ कैसे निकलता है।

शायद आपके पास एक बग है।

+0

सिस्टम क्रैश होने वाला एक प्रोग्राम सामान्य नहीं है। एक आवेदन ऑपरेटिंग सिस्टम को कभी दुर्घटनाग्रस्त करने में सक्षम नहीं होना चाहिए। यदि यह हार्डवेयर नहीं है, तो यह ऑपरेटिंग सिस्टम में एक बग की अधिक संभावना है। – dreamlax

+0

मेरे अनुभव में बीएसओडी कर्नेल ड्राइवरों में ओएस और/या बग में बग पर निर्भर करता है। इसलिए, मुझे नहीं लगता कि ओएस एक पूरी तरह से काम कर रहे आवेदन के साथ खराब हो जाएगा। यहां कम से कम परीक्षण किया गया हिस्सा क्या है? मैं कहूंगा कि एप्लिकेशन हार्डवेयर या ओएस नहीं है। –

+0

मेरा मुद्दा यह है कि ओएस में एक बग सिस्टम को बीएसओडी को खराब करने के लिए सक्षम बनाता है लेकिन यदि बीएसओडी में कोई बग नहीं है तो शायद बीएसओडी नहीं होगा। –

4

मुझे संदेह है कि ऐसा इसलिए है क्योंकि मेरा कंप्यूटर ओवरक्लॉक है।

यह निश्चित रूप से संभव है। थोड़ी देर के लिए इसे सामान्य गति पर सेट करने का प्रयास करें।

क्या यह मेरे प्रोग्राम को कोड करने के तरीके के कारण हो सकता है?

उपयोगकर्ता मोड में चल रहे एक प्रोग्राम को बीएसओडी का कारण बनने की संभावना बहुत कम है।

2

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

5

आपके द्वारा वर्णित ऑपरेशन की तरह पहले से ही समानांतर है। एक से अधिक नौकरी चलाना वास्तव में चोट प्रदर्शन हो सकता है। इसका कारण यह है कि किसी भी प्रोसेसर का कैश सीमित आकार का होता है, और जितना अधिक आप एक साथ करने की कोशिश करते हैं, तो कैश के प्रत्येक थ्रेड के हिस्से को छोटा कर दिया जाता है।

आप कुछ प्रोसेसिंग लोड को भंग करने के लिए अपने जीपीयू का उपयोग करके विकल्पों में भी देख सकते हैं। सीपीयू की इसी तरह की पीढ़ियों की तुलना में आधुनिक जीपीयू अधिकांश प्रकार के वीडियो रूपांतरण के लिए काफी अधिक कुशल हैं।

-1

यदि विंडोज प्लेटफ़ॉर्म में, कुछ काम करने के बाद एक सीपीयू को सूचित करने के लिए कॉल करने के लिए कॉल करें, तो आप सीपीयू को अन्य प्रक्रियाओं में बनाना चाहते हैं। ऐसे ही समारोह सोने के लिए एक कॉल करें:

Slepp (0);

0
बीएसओडी त्रुटि कोड के अभाव (देख के लिए उपयोगी) के साथ

यह इस एक के साथ मदद करने के लिए थोड़ा मुश्किल है।

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

0

नींद (1); सीपीयू के उपयोग को आधा में कटौती करेगा। मैं उसी समस्या में भाग गया एक सीपीयू गहन एल्गोरिदम।

+2

केवल तभी यदि आपकी कार्य इकाई 1 एमएमएस लंबी है और आप एकाधिक धागे का उपयोग नहीं कर रहे हैं। यदि ऐसा है, तो यह आपकी * गति * को आधे में भी काट देगा। –

4

अनुमान में, मैं कहूंगा कि आप 3-कोर मशीन (या 4, 100% उपयोग दिए गए) के नहीं चल रहे हैं, और समांतरता आपके प्रदर्शन को सक्रिय रूप से चोट पहुंचाएगी यदि आप कोर से अधिक धागे का उपयोग करते हैं प्रति सीपीयू कोर केवल एक धागा बनाओ ई, और जो कुछ भी आप करते हैं, एक ही समय में पर विभिन्न धागे द्वारा डेटा तक पहुंच नहीं है। अधिकांश मल्टी-कोर CPUs में कैश-लॉकिंग एल्गोरिदम पूरी तरह से आपके प्रदर्शन को मार देंगे। इस मामले में, एन-कोर सीपीयू प्रोसेसिंग एल-फ्रेम एनीमेशन पर, मैं फ्रेम 0- (एल/एन), थ्रेड 2 फ्रेम (एल/एन) - (2 * एल/एन) पर थ्रेड 1 का उपयोग करता हूं। .. फ्रेम पर धागा एन ((एन -1) * एल/एन) -एल। अनुक्रम में विभिन्न संयोजन (ए-बी, बी-सी, सी-ए) करें ताकि आप अपने कैश को फेंक न दें, यह कोड के लिए आसान होना चाहिए।

एक साइड नोट के रूप में? वास्तविक गणना इस की तरह 100% CPU का उपयोग करना चाहिए, इसका मतलब है कि यह जितना तेज़ हो सके उतना तेज़ हो रहा है।

+0

टिप, साइमन के लिए धन्यवाद। मैं निश्चित रूप से उन तरीकों पर एक नज़र डालेगा जिसमें मैं अपना प्रोग्राम अधिक कैश अनुकूल बना सकता हूं – sneg

1

सिमड ऑपरेशंस का उपयोग करने में देखें। मुझे लगता है कि आप इस मामले में एसएसई चाहते हैं। वे अक्सर समांतरता से बेहतर पहले चरण होते हैं क्योंकि उन्हें सही होने में आसान होता है और अधिकांश रैखिक बीजगणित प्रकार के संचालन के लिए एक बहुत भारी बढ़ावा प्रदान करते हैं।

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

+0

बस साइड-नोट के रूप में, मैंने सिमड ऑपरेशंस का उपयोग करने का प्रयास किया। लेकिन फिर मैंने/arch: sse2 ध्वज का उपयोग करके संकलन करने का प्रयास किया। प्रदर्शन बहुत समान दिखता था इसलिए मुझे लगता है कि संकलक विस्तारित निर्देश सेट का उपयोग करने में बहुत अच्छा काम करता है। – sneg

0

अपने प्रोसेसर दो कोर होने पर या अधिक आप कार्य प्रबंधक के पास जाकर प्रोग्राम नाम पर प्रक्रियाओं और राइट क्लिक करने के लिए जाने के लिए और क्लिक कर सकते हैं Set affinity और प्रोग्राम को कम कोर का उपयोग करने के लिए सेट करें।

यह तो अधिक समय लग कार्रवाई का आग्रह कर रहे करने के लिए होगा, लेकिन CPU उपयोग में एक महत्वपूर्ण कमी का कारण होगा।

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