C ++: преднамеренное ограничение использования процессора - PullRequest
6 голосов
/ 30 апреля 2011

В моей компании мы часто тестируем производительность наших USB и FireWire-устройств под нагрузкой процессора.

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

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

Для запуска одного экземпляра будет использоваться 1 / X ЦП, где X - количество ядер.

Так, например, если мы находимся на 8-ядерном ПК и хотим посмотреть, как наше устройство работает с 50% загрузкой ЦП, мы можем открыть четыре экземпляра одновременно и так далее ...

Мне интересно:

  1. Что решает, какая часть процессора будет израсходована? он просто запускает все так быстро, как может в одном потоке в однопоточном приложении?

  2. Есть ли способ добровольно ограничить максимальное использование процессора, которое может использовать ваша программа? Я могу подумать о некоторых «неаккуратных» способах (добавить команды сна или что-то в этом роде), но есть ли способ ограничить некоторый определенный процент доступного процессора или что-то в этом роде?

Ответы [ 4 ]

6 голосов
/ 30 апреля 2011

квоты процессора на Windows 7 и Linux .

Также на QNX (т.е. ОС Blackberry Tablet) и LynuxWorks

В случае неработающих ссылок статьи имеют название:

  • Windows - «Ограничения частоты процессора в Windows Server 2008 R2 и Windows 7»
  • Linux - «Ограничитель использования процессора для Linux»
  • QNX - «Адаптивное разбиение»
  • LynuxWorks - «Разбиение операционных систем» и «ARINC 653»
1 голос
/ 30 апреля 2011
  1. ОС обычно решает, как планировать процессы и на каких процессорах они должны работать.В основном он поддерживает готовую очередь для процессов, которые готовы к запуску (не помечены для завершения и не заблокированы, ожидая некоторого ввода-вывода, события и т. Д.).Всякий раз, когда процесс использует свой временной интервал или блокирует его, он в основном освобождает ядро ​​обработки, и ОС выбирает другой процесс для запуска.Теперь, если у вас есть процесс, который всегда готов к запуску и никогда не блокируется, этот процесс, по сути, запускается всякий раз, когда он может, таким образом, увеличивая загрузку процессора до 100%.Конечно, это немного упрощенное описание (есть такие вещи, как приоритеты процесса, например).
  2. Обычно нет общего способа достичь этого.Операционная система, которую вы используете, может предложить какой-то механизм для этого (какая-то квота процессора).Вы можете попытаться измерить, сколько времени прошло, сколько процессорного времени потратил ваш процесс, а затем перевести процесс в режим ожидания на определенные периоды, чтобы получить приблизительное значение требуемой загрузки ЦП.
0 голосов
/ 30 апреля 2011

Проблема не в том, сколько времени процессор тратит на холостом ходу, а в том, сколько времени занимает запуск кода.Кому интересно, если он простаивает или выполняет низкоприоритетную занятую работу, пока задержка низкая?

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

Просмотрите вашу базу данных ошибок, найдите реальные жалобы клиентов и используйте реальное программное и тестовое оборудование для воспроизведения ситуации, которая на самом деле сделал кого-то недовольным.Разработайте тест производительности параллельно с жесткими и значимыми требованиями к производительности.

0 голосов
/ 30 апреля 2011

Вы, по сути, ответили на свои вопросы!

Ключевая черта кода, который сжигает много ЦП, заключается в том, что он никогда не делает ничего, что блокирует (например, ожидание сетевого или файлового ввода-вывода), иникогда не возвращает добровольно свой временной интервал (например, sleep () и т. д.).

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

Поскольку вы предположили, что однопоточный код, соответствующий этому описанию, будет насыщать ядро ​​ЦП, если ОС не имеет больше этих процессов, чем имеетЯдра для их запуска - тогда он будет распределять их по кругам, и загрузка каждого из них будет составлять некоторую долю от 100%.

...