"Тажелая" программа в Linux:как бы мне разгрузить процессор?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
PVOzerski
постоялец
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб
Контактная информация:

"Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение PVOzerski »

Написал я под свои нужды программу, которая много считает (операции, в основном, над числами с плавающей точкой). Обнаружил, что в процессе работы она сильно нагружает процессор (в результате чего наблюдал зависания и вылеты иксов на двух компах невзирая на принудительное снижение приоритета путем запуска через nice). Вопрос такой: как уменьшить нагрузку, хотя бы ценой быстродействия? Сейчас у меня в главном цикле есть вызов метода Application.ProcessMessages, но я не знаю, как он реализован в LCL-обертке GTK и разгружает ли он процессор. Равно как и не знаю, как сказывается на нагрузке использование типа extended по сравнению с double и нет ли здесь резервов.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение Сквозняк »

Вопрос такой: как уменьшить нагрузку, хотя бы ценой быстродействия?
Очень просто, используя sleep(2); в циклах при ожидании. Если не помогает, создаёте глобальную типизованную константу и вставляете в разные циклы процедуру увеличивающие её на единицу. Как только значение превысит критическое, то срабатывает sleep(2); и константа обнуляется.
PVOzerski
постоялец
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб
Контактная информация:

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение PVOzerski »

Спасибо, попробую.
Аватара пользователя
Light13
постоялец
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение Light13 »

1) Забыть про Application.ProcessMessages
2) Вынести все вычисления в дополнительный поток - его можно и с пониженным приоритетом стартануть попробовать
3) Совет про sleep стоит попробовать (опять же в доп потоке)
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение debi12345 »

Написал я под свои нужды программу, которая много считает (операции, в основном, над числами с плавающей точкой). Обнаружил, что в процессе работы она сильно нагружает процессор (в результате чего наблюдал зависания и вылеты иксов на двух компах невзирая на принудительное снижение приоритета путем запуска через nice). Вопрос такой: как уменьшить нагрузку, хотя бы ценой быстродействия?


Раз даже NICE не помогает, то :

1) пересобрать ядро с Desktop task sheduler latency
2) поставить нормальный (на термотрубках) кулер на проц.
PVOzerski
постоялец
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб
Контактная информация:

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение PVOzerski »

2 debi12345:
Спасибо за совет. Насчет кулера - подумаю относительно домашнего компа. Но вот своей студентке на ноут я не только кулер не смогу заменить, но и ядро менять не стану. Впрочем, и на своей машине ядро тоже трогать лишний раз неохота :)

2 Light13:
Насчет потоков - не очень понял, чтО это может дать, кроме возможности гибкого управления приоритетами. Но ежели ход расчетов надо выводить на экран, потоки все равно придется синхронизовать - ну, либо организовывать какой-то обмен сообщениями между потоками, что только добавит нагрузки.

2 Сквозняк:
Вот Sleep - это, кажется, работает. Я, правда, время задержки сделал управляемым - через параметры запуска и через менюшку. Ksysguard показывает ощутимую разгрузку.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение debi12345 »

Вот Sleep - это, кажется, работает. Я, правда, время задержки сделал управляемым - через параметры запуска и через менюшку. Ksysguard показывает ощутимую разгрузку.


Конечно будет работать, однако ценой кратного снижения скорости расчтов...
PVOzerski
постоялец
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб
Контактная информация:

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение PVOzerski »

>однако ценой кратного снижения скорости расчтов

А что, есть варианты? Для двухъядерника, впрочем, возможно (за счет перераспределения нагрузки между ядрами) - а вот для одноядерного ноута я ничего другого придумать, пожалуй, не могу.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение debi12345 »

А что, есть варианты?

Думаю, ваща задача должна уметь динамически оценивать занимаемую ей полосу (или температуру разогрева) CPU (возможно настраиваемую) и по результататм оценки динамически подгонять аргумент Sleep-вызова.
Или, если у Вас новая видеокарта (fermini-семейство от NVidia и т.п.) - передавать часть рассчетов этой видеокарте ( через VDPAU или DirectCompute ).
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение Nik »

А может стоит попытаться немного оптимизировать алгоритм расчётов?
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38
Контактная информация:

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение hinst »

Значит так, вот реальный совет :idea:
делаешь два потока. В одном вычисления без Sleep, как они есть.
Другой поток вспомогательный, занимается тем, что постоянно останавливает и запускает вновь основной поток.

Код: Выделить всё

repeat main.Pause; sleep(50); main.Resume; sleep(50); until false;

Таким образом, меняя величины в двух вызовах sleep, можешь отрегулировать, сколько процессора будет заедать.
Если поставишь 10 после Pause и 90 после Resume, будет отъедать 90 процентов.
Я сам так делал, реальный способ!
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение debi12345 »

Для двухъядерника, впрочем, возможно (за счет перераспределения нагрузки между ядрами)

Линукс сам будет переключать ядра - Вас не спросит :)
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение Сквозняк »

Вот именно, стоит написать программу, которая не использует паузы в работе, как одно из ядер оказывается постоянно забито работой под завязку. Например, сканирование нажатий клавиш без использования пауз, может и увеличит отзывчивость на микроскопическую величину, но в комнате станет ощутимо теплее. Уменьшение приоритета приложения уменьшит тормоза но на нагрузку процессора сильно не повлияет. На одноядернике обжору не заметно, но на двухъядернике шило в мешке утаить сложнее. А если количество таких приложений равно количеству ядер, то это просто ахтунг. В тяжёлых программах, работающих длительное время, должна быть функция ограничения потребляемой мощности а пользователь пусть сам решает, нужна ему максимальная скорость или нет. Если задача всё равно успеет просчитаться за ночь, то многих это устроит. Более того, снижение нагрузки на процессор это такой вид спорта - временно отключил жабу в броузере и наслажнайся уменьшением парникового эффекта на планете:)
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение vada »

Что нам говорит наука кибернетика?
-"Любую программу можно сократить хотя бы на одну команду".
-"Время выполнении любой программы можно сократить хотя бы на один такт".

Я бы копал в сторону вашего "тяжелого" алгоритма.
daesher
постоялец
Сообщения: 221
Зарегистрирован: 09.03.2010 21:17:14

Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?

Сообщение daesher »

vada писал(а):Что нам говорит наука кибернетика?
-"Любую программу можно сократить хотя бы на одну команду".
-"Время выполнении любой программы можно сократить хотя бы на один такт".

Я бы копал в сторону вашего "тяжелого" алгоритма.

Оптимизация алгоритма - путь, безусловно, верный, но если задача объективно тяжёлая, то проблемы нагрузки на процессор это не решит. Ну, будет программа работать не час, а 45 минут - нагрузка на процессор не уменьшится.
Т.е., вопрос разгрузки процессора (или выбора процессора/системы, устойчивых к длительным нагрузкам) - это одно, а вопрос оптимизации - совсем другое.
Ответить