2009-03-07 5 views
6

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

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

+0

Это самый очевидный ответ ... Но, как я уже сказал, некоторые сложные тесты и компьютерные игры никогда не разбивали мой компьютер. Почему они никогда не разбивали мой компьютер? – sneg

+0

sneg: Из-за довольно фундаментального факта о запуске вашего компьютера (или чего-либо еще) за пределами спецификаций он был разработан для: Результаты * непредсказуемы *. Ни один тест не может гарантировать стабильность вашего компьютера. Downclock и посмотреть, устраняет ли это проблему. Скорее всего. – jalf

+0

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

ответ

5

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

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

Чтобы провести аналогию с автопробегом на дальних расстояниях, есть два способа, чтобы попытаться выиграть:

  1. сделать автомобиль быстрее
  2. сделать меньше остановок и побочные поездки

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

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

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

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

+0

Спасибо, за хороший вывод в эту тему, Майк. У меня возникли проблемы с выбором ответа, потому что все они были одинаково полезны, и все это дало мне о чем подумать. Однако ваш ответ дает хорошее закрытие. – sneg

+0

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

9

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

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

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

Но сначала я хотел бы посмотреть на разгонном-вопросе ...

+0

«Я предполагаю, что ОС, из-за BSOD»: из-за имени, правильно? Не то, чтобы он разбился? : D –

+0

BSOD = синий экран смерти, в основном используемый для синего экрана ошибок в операционных системах Windows, поэтому я догадался о Windows из-за имени. Поведение при сбоях не будет хорошим индикатором для Windows в этих условиях, потому что каждая ОС будет вылетать, если оборудование работает за его пределами. – Kosi2801

-1

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

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

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

1

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

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

+0

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

+0

По моему опыту BSOD зависит от ошибки в ОС и/или ошибок в драйверах ядра. Таким образом, я не думаю, что ОС будет работать неправильно с совершенно работающим приложением. Что является наименее проверенной частью здесь? Я бы сказал, что приложение не аппаратное обеспечение или ОС. –

+0

Я хочу сказать, что ошибка в ОС позволяет использовать приложение BSOD для системы сбоя, но, возможно, BSOD, если приложение не имеет ошибки. –

4

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

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

Возможно, это связано с тем, как я закодировал свою программу?

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

2

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

5

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

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

-1

Если на платформе Windows поместите после некоторой работы один вызов функции для информирования CPU, который вы хотите сделать процессором для других процессов. Совершение вызова спать функции так:

Slepp (0);

0

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

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

0

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

+2

Только если ваш рабочий блок имеет длину 1 мс, и вы не используете несколько потоков. Если это так, он также сократит * скорость * пополам. –

4

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

В качестве примечания стороны? Real расчет вот так должен использовать 100% -ный процессор, это значит, что все будет как можно быстрее.

+0

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

1

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

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

+0

Как замечательная сторона, я попытался использовать операции SIMD. Но потом я попытался скомпилировать с использованием/arch: флаг sse2. Производительность выглядела очень похоже, поэтому я предполагаю, что компилятор неплохо справляется с использованием расширенного набора команд. – sneg

0

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

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

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

  • Нет связанных вопросов^_^