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

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.

6 Ответы

0 голосов
от
Я был просто интересно, если есть элегантный способ установить максимальную нагрузку на CPU для определенного потока выполнения интенсивных вычислений. Сейчас у меня находится самый трудоемкий цикл в потоке (это не только сжатие) и использовать
GetTickCount()
и
Sleep()
с жестко закодированные значения. Это гарантирует, что цикл продолжается в течение определенного периода времени и не проживающих на определенный минимальный срок. Это более или менее делает свою работу, т. е. гарантии, что поток не будет использовать более 50% ЦП. Однако поведение зависит от количества ядер процессора (огромный минус) и просто некрасиво (меньше минус :)). Любые идеи?
0 голосов
от
Мне не известны какие-либо API, чтобы получить планировщик ОС, чтобы делать то, что вы хотите (даже если поток находится в режиме ожидания-приоритет, если нет более приоритетных потоков, готовы, ваша будет работать). Однако, я думаю, можно импровизировать довольно элегантный функция регулирования основан на том, что вы уже делаете. По существу (я не имею разработки для Windows машина под рукой): Выберите количество времени по умолчанию-нить будет спать каждую итерацию. Затем, на каждой итерации (или на каждой N-й итерации, такой, что функция регулирования сам по себе не становятся значительные нагрузки на процессор), Вычислить количество процессорного времени ваш поток, используемый с момента последней функции регулирования называлась (Я буду называть это dCPU). Вы можете использовать GetThreadTimes() API, чтобы получить время, которое поток проводит. Вычислить количество реального время, прошедшее с момента последней функции регулирования называлась (Я буду называть это выбранных в мобильном приложении). dCPU / выбранных в мобильном приложении-процент использования процессора (одного процессора). Если она выше, чем требуется, увеличить время сна, если меньше, уменьшайте время сна. Ваш поток спать на вычисленное время. В зависимости от того, как ваш Барбос вычисляет загрузку процессора, вы можете использовать GetProcessAffinityMask (), чтобы узнать, сколько процессоров в системе. dCPU / (выбранных в мобильном приложении * ЦП) - это процент от общего времени, выделяемого процессором. Вам все равно придется выбрать некоторые магические числа на начальный момент времени сна и инкремент/декремент количества, но я думаю, что этот алгоритм может быть настроен, чтобы сохранить поток, работающий в довольно близко к решительным процентов процессора.
0 голосов
от
На Linux, вы можете изменить приоритет выполнения потока с хорошим().
0 голосов
от
Я не могу думать ни о каких кросс-платформенный способ, что вы хотите (или любое гарантированный способ полной остановки), но как вы используете, возможно, GetTickCount вы не заинтересованы в кросс-платформенный :) Я хотел бы использовать межпроцессное взаимодействие и установить интенсивные процессы хороших уровней, чтобы получить то, что вы требуете, но я не уверен, что это подходит для вашей ситуации. Редактировать: Я согласен с Бернардом, который является, почему я думаю, что процесс, а не поток может быть более подходящим, но он просто может не соответствовать вашим целям.
0 голосов
от
Проблема в том, что это не нормально хотеть покинуть простоя ЦП, пока у вас есть работа, чтобы сделать. Обычно вы установить фоновое задание приоритетом простоя, и пусть ОС управления планированием все процессорное время, которое не используется интерактивные задания. Это звучит для меня такой проблемы как процесс Барбоса. Если фоновая задача-это ЦП, то вы хотите занять все процессорное время для выполнения своей задачи. Может быть, вы должны смотреть на отладка программы Барбос?
0 голосов
от
Вы сможете изменить приоритет потока, но при изменении максимального использования либо потребуют голосования и хаки для ограничения, как многие вещи происходят, или, используя средства ОС, которые можно установить максимальное использование процесса. Однако, я не вижу никаких обстоятельств, где вы хотели бы сделать это.
...