Как уменьшить использование процессора программой? - PullRequest
6 голосов
/ 07 марта 2009

Я написал многопоточную программу, которая выполняет некоторые тяжелые вычисления с большим количеством операций с плавающей запятой. В частности, это программа, которая сравнивает последовательности анимации кадр за кадром. То есть он сравнивает данные кадра из анимации A со всеми кадрами в анимации B для всех кадров в анимации A. Я выполняю эту интенсивную операцию параллельно для различных анимаций, поэтому программа может работать с парой AB, парой BC и парой CA в параллельно. Программа использует QtConcurrent и функцию «map», которая отображает контейнер с движениями на функцию. QtConcurrent управляет пулом потоков для меня, я работаю на процессоре Intel Quad Core, поэтому он порождает 4 потока.

Теперь проблема в том, что мой процесс разрушает мой процессор. Использование является постоянным на 100%, и я на самом деле получаю «Синий экран смерти», если запускаю свою программу с достаточно большим набором движений (ошибка страницы в невыгружаемой области). Я подозреваю, что это потому, что мой компьютер разогнан. Однако может ли это быть из-за того, как я кодировал свою программу? Некоторые очень интенсивные тестовые инструменты, которые я использовал для проверки стабильности своей машины, никогда не ломали мой компьютер. Есть ли способ контролировать, как моя программа использует мой процессор для снижения нагрузки? Или, может быть, я неправильно понимаю свою проблему?

Ответы [ 13 ]

9 голосов
/ 07 марта 2009

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

Это также может быть довольно странная ошибка памяти, когда вы повреждаете свою оперативную память таким образом, что Windows (я полагаю, ОС из-за BSOD) больше не может восстановиться (очень маловероятно, но кто знает).

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

Но сначала я бы посмотрел на проблему с разгоном ...

5 голосов
/ 09 марта 2009

Здесь есть несколько отличных ответов.

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

Чтобы провести аналогию с автогонкой на длинные дистанции, есть два способа выиграть:

  1. Заставь машину ехать быстрее
  2. Делать меньше остановок и обходов

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

Чтобы найти потраченные впустую циклы в вашей программе, как сказал Кеннет Кокран, никогда не догадайтесь. Если вы что-то исправили, не доказав, что это проблема, вы сделаете предположение.

Популярным способом обнаружения проблем с производительностью является использование профилировщиков.

Однако я часто это делаю, и мой метод таков: http://www.wikihow.com/Optimize-Your-Program%27s-Performance

5 голосов
/ 07 марта 2009

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

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

5 голосов
/ 07 марта 2009

Я подозреваю, что это потому, что мой компьютер разогнан.

Это определенно возможно. Попробуйте на некоторое время установить его на нормальную скорость.

Может ли это быть из-за того, как я кодировал свою программу?

Программа, работающая в пользовательском режиме, вряд ли вызовет BSOD.

4 голосов
/ 08 марта 2009

Я бы сказал, что вы не используете 3-ядерный компьютер (или 4, если используется 100%), и распараллеливание будет активно снижать производительность, если вы используете больше потоков, чем ядер. Сделайте только один поток на ядро ​​ЦП, и что бы вы ни делали, никогда не получит доступ к данным из разных потоков одновременно . Алгоритмы блокировки кеша в большинстве многоядерных процессоров абсолютно убьют вашу производительность. В этом случае на N-ядерном процессоре, обрабатывающем L-кадровую анимацию, я бы использовал поток 1 в кадрах 0- (L / N), поток 2 в кадрах (L / N) - (2 * L / N),. .. резьба N на кадрах ((N-1) * L / N) -L. Выполняйте различные комбинации (A-B, B-C, C-A) по порядку, чтобы не перегружать кэш, кроме того, код должен быть проще.

Как примечание? Реальное вычисление , как это должно использовать 100% ЦП, это означает, что он работает так быстро, как только может.

2 голосов
/ 07 марта 2009

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

1 голос
/ 08 марта 2009

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

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

1 голос
/ 07 марта 2009

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

Возможно, у вас есть ошибка.

0 голосов
/ 16 июня 2015

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

Тогда потребуется больше времени для выполнения запрашиваемых вами действий, но это вызовет ЗНАЧИТЕЛЬНОЕ снижение загрузки ЦП.

0 голосов
/ 08 марта 2009

Sleep (1); сократит использование процессора в два раза. Я столкнулся с той же проблемой, работая с интенсивным процессором.

...