C ++ এ CPU হ্রাসকরণ

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
আপনি কোন দৃশ্যমান আচরণ অর্জন করতে চান? যে, এই ঘড়িটি আপনার থ্রেড থেকে কি চায়? তারা কি কোন উপায় দ্বারা ব্যবহার করা উচিত বলে, 80% CPU এর? প্রক্রিয়াকরণের ভিত্তি অগ্রাধিকার নির্ধারণ করতে পারে সম্ভবত WD ডাউন শান্ত?
যোগ লেখক wordmonger, উৎস

5 উত্তর

লিনাক্সে, আপনি চমৎকার একটি থ্রেডের সময়সূচী অগ্রাধিকার পরিবর্তন করতে পারেন ()।

0
যোগ
অন্যান্য প্ল্যাটফর্মে অনুরূপ বৈশিষ্ট্য রয়েছে, দেখুন: অগ্রাধিকার"> stackoverflow.com/questions/18884510/… আমি মনে করি এটি সমস্যার একটি চমৎকার সমাধান হতে পারে, যদিও বিভিন্ন শব্দের সাথে - যেমন 50% CPU খরচ গ্যারান্টি
যোগ লেখক milianw, উৎস

আমি কি আপনি চান কোন ক্রস প্ল্যাটফর্ম উপায় মনে করতে পারেন না (বা কোন নিশ্চিতভাবে পূর্ণ স্টপ) কিন্তু আপনি GetTickCount ব্যবহার করছেন সম্ভবত আপনি ক্রস প্ল্যাটফর্ম আগ্রহী না :)

আমি আন্তঃক্রিয়ার যোগাযোগ ব্যবহার করতে চাই এবং আপনার প্রয়োজনীয়গুলি পেতে নিবিড় প্রসেসগুলি চমৎকার মাত্রাগুলি সেট করি তবে আমি নিশ্চিত যে আপনার পরিস্থিতির জন্য উপযুক্ত।

সম্পাদনা করুন: আমি বার্নার্ড এর সাথে একমত যে, কেন আমি মনে করি একটি থ্রেডের পরিবর্তে একটি প্রক্রিয়া বেশি উপযুক্ত হতে পারে কিন্তু এটি ঠিক নয় আপনার উদ্দেশ্য

0
যোগ

সমস্যাটি হচ্ছে আপনার কাজ করার সময় CPU নিরব থেকে বেরিয়ে যাওয়ার স্বাভাবিক নয়। সাধারনত আপনি আইডেল অগ্রাধিকারের জন্য একটি ব্যাকগ্রাউন্ড টাস্ক সেট করেন, এবং ইন্টারেক্টিভ কর্ম দ্বারা ব্যবহৃত হয় না এমন সব CPU টাইমকে OS কে হ্যান্ডেল করতে দিন।

এটা আমার মত শব্দটি হল ওয়াচডগ প্রসেস।

যদি আপনার ব্যাকগ্রাউন্ড টাস্কটি সিপিইউ-বাউন্ড হয় তবে আপনি চাইলে সমস্ত অপারেটিং সিপিইউ সময় তার কাজের জন্য নিতে পারেন।

হয়তো আপনি watchdog প্রোগ্রাম ফিক্সিং তাকান উচিত?

0
যোগ
একটি নিষ্ক্রীয় CPU চান খুব যুক্তিসঙ্গত। হয়তো আপনি কিছু গণনা করতে চান তবে যতক্ষণ না এটি আপনার ল্যাপটপের CPU ফ্যানটি স্পিন করে না ততক্ষণ এটি দ্রুত কাজ করে না।
যোগ লেখক Ringding, উৎস

আমি যে কোনও এপিআই সম্পর্কে অবহিত নই যে আপনি যা করতে চান তার জন্য OS এর নির্ধারকটি পেতে পারেন (এমনকি যদি আপনার থ্রেড নিষ্ক্রিয়তা-অগ্রাধিকার না থাকে, যদি কোনও উচ্চতর অগ্রগতি তৈরি থ্রেডগুলি আপনার চলবে না)। যাইহোক, আমি মনে করি আপনি ইতিমধ্যে কি করছেন উপর ভিত্তি করে একটি মোটামুটি মার্জিত থ্রোলটিং ফাংশন সংস্কার করতে পারেন। মূলত (আমি একটি উইন্ডোজ ডেভিস মেশিন কাজ না):

থ্রেড প্রতিটি পুনরাবৃত্তির ঘুম হবে একটি ডিফল্ট পরিমাণ চয়ন করুন। তারপর, প্রতিটি পুনরাবৃত্তির (বা প্রতি nth পুনরাবৃত্তির উপর, যেমন থ্রোল্টলিং ফাংশন নিজেই একটি গুরুত্বপূর্ণ CPU লোড হয়ে না),

  1. আপনার থ্রোল্টলিং ফাংশনটি (আমি এই dCPU টি কল করবো) বলা হয়েছিল যে শেষ সময় থেকে আপনার থ্রেড ব্যবহার করা CPU সময়কালের পরিমাণ গণনা করুন। আপনি GetThreadTimes() API ব্যবহার করতে পারেন যাতে আপনার সময় পরিমাণটি পেতে পারে থ্রেড কার্যকর করা হচ্ছে।
  2. শেষবারের সময় আপনার থ্রোল্টলিং ফাংশনটি বলা হতো (আমি এই ডক্লকটি কল করবো)।
  3. ডিসিপিইউ / ডক্লকটি CPU CPU ব্যবহার করে (এক CPU এর)। যদি আপনার চেয়ে বেশি হয় তবে আপনার ঘুমের সময় বাড়িয়ে দিন, যদি নিচু থাকে, ঘুমের সময় কমে।
  4. গণনাকৃত সময়ের জন্য আপনার থ্রেড ঘুম।

আপনার ওয়াচডগ কীভাবে CPU ব্যবহার নির্ণয় করে তা নির্ভর করে আপনি ব্যবহার করতে চাইতে পারেন। GetProcessAffinityMask() সিস্টেমটি কতগুলি CPUs খুঁজে বের করতে। dCPU / (dClock * CPUs) উপলব্ধ সর্বনিম্ন CPU সময়ের শতাংশ।

আপনি এখনও প্রাথমিক ঘুমের সময় এবং বৃদ্ধি / হ্রাস পরিমাণ জন্য কিছু জাদু সংখ্যা বাছাই করতে হবে, কিন্তু আমি এই অ্যালগরিদম CPU- র একটি নির্ধারিত শতাংশ মোটামুটি ঘনিষ্ঠভাবে চলমান একটি থ্রেড রাখতে tuned হতে পারে।

0
যোগ
যদি আপনার লক্ষ্য সিপিইউ সময় নষ্ট হয় এড়ানোর জন্য, একটি সস্তা পরিচায়ক সম্ভবত একটি ভাল পছন্দ। আপনার থ্রেডটি উচ্চ সিস্টেম লোডের আওতায় আছানোর জন্য এটি কতটা সমস্যা তা নির্ভর করে আপনি শুধু বিচ্ছিন্ন প্রাচীর-ঘড়ির সময় পরীক্ষা করতে পারেন। X86 এ, এটি খুবই সস্তা, কারণ rdtsc এর উপর ভিত্তি করে সময় ফাংশনগুলি এমনকি কার্নেল মোড প্রবেশ করতে হবে না। একাধিক সিস্টেম কলগুলি এমনকি n পুনরাবৃত্তিগুলি এক মাত্র তৈরির চেয়েও খারাপ, যদি এটি আপনাকে অনেক বেশি করে n বাড়িয়ে দেয় এবং এখনও আপনার যে আচরণটি চান তা পান।
যোগ লেখক Peter Cordes, উৎস

আপনি একটি থ্রেড অগ্রাধিকার পরিবর্তন করতে সক্ষম হতে পারেন, কিন্তু সর্বাধিক ব্যবহার পরিবর্তন করতে হবে ভোটের প্রয়োজন হবে এবং হ্যাক কতগুলি ঘটছে, বা OS সরঞ্জাম ব্যবহার করে যা একটি প্রক্রিয়া সর্বাধিক ব্যবহার নির্ধারণ করতে পারে। যাইহোক, আমি এমন কোন পরিস্থিতিতে দেখছি না যেখানে আপনি এটি করতে চান।

0
যোগ