Создать поток с> 70% загрузкой процессора - PullRequest
4 голосов
/ 19 января 2009

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

Теперь я хочу протестировать эту программу в разное время, когда загрузка процессора составляет 100%, 50% 0% и т. Д.

Мой вопрос, как заставить процессор загружаться на 100% или может быть> 80%.

Я думаю, что создания цикла while будет достаточно

while(i++< 2000)
{
   cout<<" in while "<< endl;
   Sleep(10); // sleep for 10 ms.
}

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

Ответы [ 7 ]

7 голосов
/ 19 января 2009

Вы правильно используете цикл, но:

  • У вас есть IO
  • Вы спите

В принципе, ничто в этом цикле не займет слишком много процессорного времени по сравнению со временем, в течение которого он спит или ожидает ввода-вывода.

Чтобы убить процессор, вам нужно дать ему просто CPU. Единственный хитрый момент - убедиться, что компилятор C ++ не оптимизирует цикл. Что-то вроде этого должно быть в порядке:

// A bit like generating a hashcode. Pretty arbitrary choice,
// but simple code which would be hard for the compiler to
// optimise away.
int running_total = 23;
for (int i=0; i < some_large_number; i++)
{
    running_total = 37 * running_total + i;
}
return running_total;

Обратите внимание, что я возвращаю значение из цикла. Это должно помешать компилятору C ++ заметить, что цикл бесполезен (если вы нигде не используете значение, цикл не будет иметь смысла). Вы также можете отключить встраивание, так как в противном случае, я думаю, есть вероятность, что умный компилятор заметит, что вы вызываете функцию, не используя возвращаемое значение, и ничего не вставит. (Как указывает Сума в ответе, использование volatile при вызове функции должно отключить встраивание.)

4 голосов
/ 19 января 2009

Ваш цикл в основном спит, что означает, что он имеет очень небольшую нагрузку на процессор. Помимо Sleep, обязательно включите некоторый цикл, выполняющий любые вычисления, как этот (реализация Factorial оставлена ​​в качестве упражнения для читателя, вы можете заменить его любой другой нетривиальной функцией).

while(i++< 2000)
{
   int sleepBalance = 10; // increase this to reduce the CPU load
   int computeBalance = 1000; // increase this to increase the CPU load
   for (int i=0; i<computeBalance; i++)
   {
     /* both volatiles are important to prevent compiler */
     /* optimizing out the function */
     volatile int n = 30;
     volatile int pretendWeNeedTheResult = Factorial(n);
   }
   Sleep(sleepBalance);
}

Путем настройки sleepBalance / computeBalance вы можете настроить, сколько ЦП занимает эта программа. Если вы хотите использовать это в качестве симулятора загрузки процессора, вы можете сделать несколько дополнительных шагов:

  • в многоядерной системе обязательно создайте цикл, подобный этому, в нескольких потоках (по одному для каждого процессора), или выполните процесс несколько раз, и чтобы прогнозируемое планирование назначало привязку потока / процесса в явном виде
  • иногда вам также может понадобиться увеличить приоритет потока / процесса, чтобы имитировать среду, в которой процессор сильно загружен приложениями с высоким приоритетом.
3 голосов
/ 19 января 2009

Используйте самовывоз из Windows SDK.

Не катите себя, когда кто-то другой уже сделал работу и передаст ее вам бесплатно.

1 голос
/ 20 января 2009

Я знаю команду "yes" в системах UNIX, когда при маршрутизации в / dev / null будет израсходовано 100% ЦП на одном ядре (оно не работает). Вы можете запустить несколько его экземпляров, чтобы использовать каждое ядро. Возможно, вы могли бы скомпилировать код «да» в вашем приложении и вызвать его напрямую. Вы не указываете, какой компилятор C ++ вы используете для Windows, но я собираюсь предположить, что он имеет какую-либо совместимость с POSIX (аля Cygwin). Если это так, то «да» должно работать нормально.

1 голос
/ 19 января 2009

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

1 голос
/ 19 января 2009

Если вы вызываете Sleep в вашем цикле, то большая часть времени цикла будет потрачена на бездействие (сон). Вот почему ваша загрузка ЦП низка - потому что этот 10-миллисекундный сон огромен по сравнению со временем, которое ЦП будет тратить на выполнение остальной части кода в каждой итерации цикла. Это нетривиальная задача - написать код для точной траты времени процессора. Предложение Роджера об использовании CPU Burn-In является хорошим.

0 голосов
/ 19 января 2009

Получите копию Ожог ЦП .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...