дросселирования процессора в C ++

голоса
39

Мне было просто интересно , если есть элегантный способ установить максимальную нагрузку на процессор для конкретного потока делать интенсивные вычисления.

Прямо сейчас я находится больше всего времени цикла в потоке (это не только сжатие) и использовать GetTickCount()и Sleep()с закодированными значениями. Он уверен , что цикл продолжается в течение определенного периода времени , и чем спит в течение определенного минимального времени. Это более или менее делает работу то есть гарантирует , что поток не будет использовать более чем 50% CPU.
Однако поведение зависит от количества ядер процессора (огромный невыгодным) и просто уродливого (меньшего недостатка :)).
Есть идеи?

Задан 05/08/2008 в 08:11
источник пользователем
На других языках...                            


5 ответов

голоса
17

Я не знаю ни одного API, чтобы сделать получить планировщик операционной системы, чтобы делать то, что вы хотите (даже если ваш поток простаивает приоритет, если нет более высокого приоритет готовых нитей, ваш будет работать). Тем не менее, я думаю, что вы можете импровизировать довольно элегантную функцию дросселирования, основанную на том, что вы уже делаете. По существу (я не имею Dev машины Windows, под рукой):

Выберите количество по умолчанию времени поток будет спать каждую итерацию. Затем на каждой итерации (или на каждой итерации п-й, такая, что функция дросселирования сама не стать значительной нагрузки на процессор),

  1. Подсчитать количество процессорного времени , ваш поток используется , так как в последний раз , ваша функция дросселировании была вызвана (я буду называть эту DCPU). Вы можете использовать GetThreadTimes () API , чтобы получить количество времени , ваш поток был выполняющимся.
  2. Подсчитать количество реального времени, прошедшего с момента последнего времени ваша функция дросселирования была вызвана (я буду называть эту dClock).
  3. DCPU / dClock является использование процессора процента (одного процессора). Если она выше, чем вы хотите, увеличить время сна, если ниже, уменьшить время сна.
  4. Иметь свой сон нити для вычисленного времени.

В зависимости от того, как сторожевые вычисляет загрузку процессора, вы можете захотеть использовать GetProcessAffinityMask () , чтобы узнать, сколько процессоров в системе есть. DCPU / (dClock * ЦП) представляет собой процент от общего процессорного времени доступно.

Вы все еще должны выбрать некоторые магические числа в течение начального времени ожидания и количества инкремента / декремента, но я думаю, что этот алгоритм может быть настроен, чтобы нить работает на довольно близко к определенным процентам CPU.

Ответил 06/09/2008 в 00:33
источник пользователем

голоса
4

В Linux, вы можете изменить приоритет планирования нити с хорошим ().

Ответил 05/08/2008 в 09:03
источник пользователем

голоса
2

Проблема заключается в том, что это не нормально, чтобы хотеть оставить простой процессора, пока есть работа. Обычно устанавливается фоновое задание IDLE приоритет, и пусть ОС обрабатывать планирования это все время процессора, который не используется интерактивных задач.

Это звучит для меня как проблема процесс сторожевого.

Если фоновая задача является CPU переплета, то вы хотите, чтобы принять все неиспользованное время процессора для своей задачи.

Может быть, вы должны смотреть на фиксируя программу сторожевого?

Ответил 06/09/2008 в 10:01
источник пользователем

голоса
2

Я не могу думать ни о каком кроссплатформенных образом, что вы хотите (или любой гарантированный способ полной остановки), но, как вы используете GetTickCount, возможно, вы не заинтересованы в кросс-платформенный :)

Я хотел бы использовать межпроцессную связь и установить интенсивные процессы хороших уровни, чтобы получить то, что вам требуется, но я не уверен, что подходит для вашей ситуации.

EDIT: Я согласен с Бернардом , поэтому я думаю , что это скорее процесс , чем поток может быть более подходящим , но он просто не может удовлетворить ваши цели.

Ответил 05/08/2008 в 08:23
источник пользователем

голоса
0

Вы можете быть в состоянии изменить приоритет потока, но изменение максимального использования будет либо требовать опроса и хак, чтобы ограничить многие вещи происходят, или с помощью средств операционной системы, которые можно установить максимальное использование процесса. Тем не менее, я не вижу каких-либо обстоятельства, при которых вы хотели бы сделать это.

Ответил 03/01/2018 в 18:06
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more