2011-06-23 3 views
3

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

+1

Добавить пустой цикл? – Flimzy

+1

Почему я читаю * вилку бомбы * .. – karlphillip

+0

@karlphillip, почему бы потреблять процессор, если бы я делал вилку? Я не, но если бы я был, я бы хотел, чтобы мои процессы потребляли меньше энергии, а не больше. Я спрашиваю, потому что моя программа должна генерировать числа. Кроме того, для чего я получил -1? Моя особенность касается конкретной цели, и она весьма полезна для повышения качества. Я ничего не нашел, объясняя решение. – TimeCoder

ответ

2

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

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

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

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

1

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

+0

Использует 10% при высоком приоритете. – TimeCoder

4

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

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

5

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

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

0

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

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

Смежные вопросы