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

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

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

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

Сообщение PVOzerski » 18.03.2011 01:00:23

Написал я под свои нужды программу, которая много считает (операции, в основном, над числами с плавающей точкой). Обнаружил, что в процессе работы она сильно нагружает процессор (в результате чего наблюдал зависания и вылеты иксов на двух компах невзирая на принудительное снижение приоритета путем запуска через nice). Вопрос такой: как уменьшить нагрузку, хотя бы ценой быстродействия? Сейчас у меня в главном цикле есть вызов метода Application.ProcessMessages, но я не знаю, как он реализован в LCL-обертке GTK и разгружает ли он процессор. Равно как и не знаю, как сказывается на нагрузке использование типа extended по сравнению с double и нет ли здесь резервов.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

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

Сообщение Сквозняк » 18.03.2011 01:09:13

Вопрос такой: как уменьшить нагрузку, хотя бы ценой быстродействия?
Очень просто, используя sleep(2); в циклах при ожидании. Если не помогает, создаёте глобальную типизованную константу и вставляете в разные циклы процедуру увеличивающие её на единицу. Как только значение превысит критическое, то срабатывает sleep(2); и константа обнуляется.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

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

Сообщение PVOzerski » 18.03.2011 01:31:18

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

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

Сообщение Light13 » 18.03.2011 10:20:46

1) Забыть про Application.ProcessMessages
2) Вынести все вычисления в дополнительный поток - его можно и с пониженным приоритетом стартануть попробовать
3) Совет про sleep стоит попробовать (опять же в доп потоке)
Аватара пользователя
Light13
постоялец
 
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

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

Сообщение debi12345 » 18.03.2011 10:56:52

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


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

1) пересобрать ядро с Desktop task sheduler latency
2) поставить нормальный (на термотрубках) кулер на проц.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение PVOzerski » 19.03.2011 12:38:37

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

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

2 Сквозняк:
Вот Sleep - это, кажется, работает. Я, правда, время задержки сделал управляемым - через параметры запуска и через менюшку. Ksysguard показывает ощутимую разгрузку.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

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

Сообщение debi12345 » 19.03.2011 15:02:30

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


Конечно будет работать, однако ценой кратного снижения скорости расчтов...
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение PVOzerski » 19.03.2011 15:31:15

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

А что, есть варианты? Для двухъядерника, впрочем, возможно (за счет перераспределения нагрузки между ядрами) - а вот для одноядерного ноута я ничего другого придумать, пожалуй, не могу.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

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

Сообщение debi12345 » 19.03.2011 17:24:26

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

Думаю, ваща задача должна уметь динамически оценивать занимаемую ей полосу (или температуру разогрева) CPU (возможно настраиваемую) и по результататм оценки динамически подгонять аргумент Sleep-вызова.
Или, если у Вас новая видеокарта (fermini-семейство от NVidia и т.п.) - передавать часть рассчетов этой видеокарте ( через VDPAU или DirectCompute ).
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение Nik » 19.03.2011 19:01:14

А может стоит попытаться немного оптимизировать алгоритм расчётов?
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение hinst » 19.03.2011 20:23:46

Значит так, вот реальный совет :idea:
делаешь два потока. В одном вычисления без Sleep, как они есть.
Другой поток вспомогательный, занимается тем, что постоянно останавливает и запускает вновь основной поток.
Код: Выделить всё
repeat main.Pause; sleep(50); main.Resume; sleep(50); until false;

Таким образом, меняя величины в двух вызовах sleep, можешь отрегулировать, сколько процессора будет заедать.
Если поставишь 10 после Pause и 90 после Resume, будет отъедать 90 процентов.
Я сам так делал, реальный способ!
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

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

Сообщение debi12345 » 20.03.2011 08:04:39

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

Линукс сам будет переключать ядра - Вас не спросит :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение Сквозняк » 21.03.2011 15:10:42

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

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

Сообщение vada » 23.03.2011 10:54:24

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

Я бы копал в сторону вашего "тяжелого" алгоритма.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

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

Сообщение daesher » 23.03.2011 11:54:58

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

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

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


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

Рейтинг@Mail.ru