सी ++ में सीपीयू थ्रॉटलिंग

I was just wondering if there is an elegant way to set the maximum CPU load for a particular thread doing intensive calculations.

Right now I have located the most time consuming loop in the thread (it does only compression) and use GetTickCount() and Sleep() with hardcoded values. It makes sure that the loop continues for a certain period of time and than sleeps for a certain minimal time. It more or less does the job i.e. guarantees that the thread will not use more than 50% of CPU.
However behavior is dependent on the number of CPU cores (huge disadvantage) and simply ugly (smaller disadvantage :)).
Any ideas?

0
जोड़ा संपादित
विचारों: 1
आप क्या दृश्य व्यवहार प्राप्त करना चाहते हैं? यही है, यह वॉचडॉग आपके धागे से क्या चाहता है? क्या उन्हें सीपीयू का 80% कहने से अधिक का उपयोग नहीं करना चाहिए? निष्क्रिय रूप से निष्क्रिय आधार को निष्क्रिय करने के लिए निष्क्रिय आधार प्रक्रिया को सेट कर सकते हैं?
जोड़ा लेखक wordmonger, स्रोत

5 उत्तर

लिनक्स पर, आप अच्छे() के साथ थ्रेड की शेड्यूलिंग प्राथमिकता बदल सकते हैं।

0
जोड़ा
अन्य प्लेटफार्मों में समान विशेषताएं हैं, यह भी देखें: stackoverflow.com/questions/18884510/… मुझे लगता है कि यह समस्या का एक अच्छा समाधान हो सकता है, हालांकि विभिन्न अर्थशास्त्र के साथ - यानी 50% CPU खपत गारंटी नहीं
जोड़ा लेखक milianw, स्रोत

मैं जो भी चाहता हूं (या किसी भी गारंटीकृत तरीके से पूर्ण स्टॉप) के किसी भी क्रॉस प्लेटफ़ॉर्म तरीके के बारे में नहीं सोच सकता लेकिन जैसा कि आप GetTickCount का उपयोग कर रहे हैं, शायद आप क्रॉस प्लेटफ़ॉर्म में रूचि नहीं रखते :)

मैं इंटरप्रोसेस संचार का उपयोग करता हूं और आपको आवश्यकतानुसार गहन प्रक्रियाओं को अच्छे स्तर निर्धारित करता हूं लेकिन मुझे यकीन नहीं है कि यह आपकी स्थिति के लिए उपयुक्त है।

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

0
जोड़ा

समस्या यह है कि जब आप काम करने के लिए सीपीयू निष्क्रिय रहते हैं तो सामान्य नहीं है। आम तौर पर आपने आईडीएलई प्राथमिकता के लिए पृष्ठभूमि कार्य सेट किया है, और ओएस को उन सभी CPU समय को शेड्यूल करने दें जिन्हें इंटरैक्टिव कार्यों द्वारा उपयोग नहीं किया जाता है।

यह मुझे लगता है जैसे समस्या वॉचडॉग प्रक्रिया है।

यदि आपका पृष्ठभूमि कार्य सीपीयू-बाध्य है तो आप अपने काम के लिए सभी अप्रयुक्त CPU समय लेना चाहते हैं।

हो सकता है कि आपको वॉचडॉग प्रोग्राम को ठीक करना चाहिए?

0
जोड़ा
एक निष्क्रिय सीपीयू चाहते हैं यह बहुत उचित है। हो सकता है कि आप कुछ गणना करना चाहते हैं लेकिन इस पर ध्यान न दें कि यह कितना तेज़ हो जाता है, जब तक यह आपके लैपटॉप पर सीपीयू प्रशंसक को स्पिन नहीं करता है।
जोड़ा लेखक Ringding, स्रोत

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

प्रत्येक पुनरावृत्ति को थ्रेड करने के लिए डिफ़ॉल्ट समय चुनें। फिर, प्रत्येक पुनरावृत्ति पर (या प्रत्येक nth पुनरावृत्ति पर, जैसे कि थ्रॉटलिंग फ़ंक्शन स्वयं एक महत्वपूर्ण CPU लोड नहीं बनता है)

  1. पिछली बार आपके थ्रॉटलिंग फ़ंक्शन को कॉल करने के बाद से आपके थ्रेड का उपयोग करने वाले CPU समय की गणना करें (मैं इस डीसीपीयू को कॉल करूंगा)। आप अपने समय की मात्रा प्राप्त करने के लिए GetThreadTimes() API का उपयोग कर सकते हैं धागा निष्पादित कर रहा है।
  2. पिछली बार आपके थ्रॉटलिंग फ़ंक्शन को कॉल करने के बाद से वास्तविक समय की मात्रा की गणना करें (मैं इस डीक्लॉक को कॉल करूंगा)।
  3. डीसीपीयू / डीक्लॉक प्रतिशत CPU उपयोग (एक सीपीयू का) है। यदि यह आपकी इच्छा से अधिक है, तो नींद का समय बढ़ाएं, यदि कम हो, तो नींद का समय कम करें।
  4. गणना के समय के लिए अपना धागा सोएं।

आपके वॉचडॉग CPU उपयोग की गणना कैसे करते हैं, इस पर निर्भर करते हुए, आप का उपयोग करना चाहेंगे GetProcessAffinityMask() यह पता लगाने के लिए कि सिस्टम के कितने CPU हैं। डीसीपीयू / (डीक्लॉक * सीपीयू) उपलब्ध कुल CPU समय का प्रतिशत है।

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

0
जोड़ा
यदि आपका लक्ष्य सीपीयू समय बर्बाद करने से बचाना है, तो एक सस्ता ह्युरिस्टिक शायद बेहतर विकल्प है। आपके थ्रेड के लिए उच्च सिस्टम लोड के तहत खुद को भूखा होने के लिए कितनी समस्या है, इस पर निर्भर करता है कि आप बस elapsed wall-clock time देख सकते हैं। X86 पर, यह बहुत सस्ता है, क्योंकि rdtsc पर आधारित समय फ़ंक्शन को कर्नेल मोड में प्रवेश करने की भी आवश्यकता नहीं है। कई सिस्टम कॉल करना भी n पुनरावृत्ति केवल एक बनाने से भी बदतर है, जब तक कि यह आपको n को बहुत अधिक बढ़ाए और फिर भी इच्छित व्यवहार प्राप्त न करे।
जोड़ा लेखक Peter Cordes, स्रोत

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

0
जोड़ा