Увеличение использования ЦП программы на C ++ - PullRequest
3 голосов
/ 23 июня 2011

У меня есть программа, написанная на C ++, которая запускает несколько циклов for в секунду, не используя ничего, что заставило бы ее ждать по любой причине.Он последовательно использует 2-10% процессора.Есть ли способ заставить его использовать больше ресурсов процессора и выполнять большее количество вычислений, не усложняя программу?Кроме того, я компилирую с C :: B на компьютере с Windows.По сути, я спрашиваю, есть ли способ ускорить выполнение моей программы за счет увеличения использования ЦП, и если да, то как.

Ответы [ 6 ]

5 голосов
/ 23 июня 2011

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

4 голосов
/ 23 июня 2011

Это действительно не право или обязанность программы требовать от системы дополнительных ресурсов.Это работа ОС как планировщика ресурсов.

Если необходимо использовать больше процессорного времени, чем ОС сочтет нужным, вам следует запросить его у ОС, используя зависящий от платформы API.В этом случае это похоже на SetPriorityClass или SetThreadPriority.

2 голосов
/ 23 июня 2011

Предполагая, что ваше приложение обладает мощностью (PROCESS_SET_INFORMATION право доступа), вы можете использовать SetPriorityClass, чтобы увеличить ваши приоритеты (конечно, в ущерб всем другим процессам).

Вы можете пойти ABOVE_NORMAL_PRIORITY_CLASS (попробуйте сначала), HIGH_PRIORITY_CLASS (будьте очень осторожны с этим) или REALTIME_PRIORITY_CLASS (я настоятельно рекомендую, чтобы вы не дали это один выстрел).

Если вы попробуете более высокие приоритеты, а тактовая частота все еще будет довольно низкой, то это, вероятно, потому, что вы не привязаны к процессору (например, записываете ли вы данные в выходной файл). В этом случае вам, вероятно, придется найти способ сделать привязанным к процессору.

Просто имейте в виду, что это может не быть необходимым (или даже желательным). Если вы работаете с более высоким приоритетом, чем другие потоки, и все еще не загружаете много ЦП, возможно, это связано с тем, что Windows (скорее всего, по праву) решила, что вам это не нужно.

1 голос
/ 23 июня 2011

Создание потока и предоставление более высокого приоритета потоку может быть одним из способов.

0 голосов
/ 23 июня 2011

Некоторые профилировщики очень хорошо указывают на узкие места в вашем коде.Например, CodeAnalyst (только для чипов AMD) содержит инструкции на цикл.Я уверен, что профилировщики Intel похожи.

Однако, как говорит Билли О'Нил, если вы работаете на 8-ядерном процессоре, то зависание на 10 процентах процессоров - это правильно.Если это ваша проблема, то в Windows msvc ++ есть параллельный режим ( библиотека параллельных шаблонов ) для стандартных алгоритмов.Это может дать параллелизацию бесплатно, если вы написали свои циклы на языке c ++ (это все равно ваша ответственность, чтобы убедиться, что ваши циклы поточнобезопасны).Я не использовал версию msvc, но gnu::__parallel_for_each и т. Д. Работают удовольствие.

0 голосов
/ 23 июня 2011

Если вы используете C ++, рассмотрите возможность использования Intel Threading Building Block . Вы можете найти несколько примеров здесь .

...