"Тажелая" программа в Linux:как бы мне разгрузить процессор?
Модератор: Модераторы
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
"Тажелая" программа в Linux:как бы мне разгрузить процессор?
Написал я под свои нужды программу, которая много считает (операции, в основном, над числами с плавающей точкой). Обнаружил, что в процессе работы она сильно нагружает процессор (в результате чего наблюдал зависания и вылеты иксов на двух компах невзирая на принудительное снижение приоритета путем запуска через nice). Вопрос такой: как уменьшить нагрузку, хотя бы ценой быстродействия? Сейчас у меня в главном цикле есть вызов метода Application.ProcessMessages, но я не знаю, как он реализован в LCL-обертке GTK и разгружает ли он процессор. Равно как и не знаю, как сказывается на нагрузке использование типа extended по сравнению с double и нет ли здесь резервов.
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
Очень просто, используя sleep(2); в циклах при ожидании. Если не помогает, создаёте глобальную типизованную константу и вставляете в разные циклы процедуру увеличивающие её на единицу. Как только значение превысит критическое, то срабатывает sleep(2); и константа обнуляется.Вопрос такой: как уменьшить нагрузку, хотя бы ценой быстродействия?
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
Спасибо, попробую.
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
1) Забыть про Application.ProcessMessages
2) Вынести все вычисления в дополнительный поток - его можно и с пониженным приоритетом стартануть попробовать
3) Совет про sleep стоит попробовать (опять же в доп потоке)
2) Вынести все вычисления в дополнительный поток - его можно и с пониженным приоритетом стартануть попробовать
3) Совет про sleep стоит попробовать (опять же в доп потоке)
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
Написал я под свои нужды программу, которая много считает (операции, в основном, над числами с плавающей точкой). Обнаружил, что в процессе работы она сильно нагружает процессор (в результате чего наблюдал зависания и вылеты иксов на двух компах невзирая на принудительное снижение приоритета путем запуска через nice). Вопрос такой: как уменьшить нагрузку, хотя бы ценой быстродействия?
Раз даже NICE не помогает, то :
1) пересобрать ядро с Desktop task sheduler latency
2) поставить нормальный (на термотрубках) кулер на проц.
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
2 debi12345:
Спасибо за совет. Насчет кулера - подумаю относительно домашнего компа. Но вот своей студентке на ноут я не только кулер не смогу заменить, но и ядро менять не стану. Впрочем, и на своей машине ядро тоже трогать лишний раз неохота
2 Light13:
Насчет потоков - не очень понял, чтО это может дать, кроме возможности гибкого управления приоритетами. Но ежели ход расчетов надо выводить на экран, потоки все равно придется синхронизовать - ну, либо организовывать какой-то обмен сообщениями между потоками, что только добавит нагрузки.
2 Сквозняк:
Вот Sleep - это, кажется, работает. Я, правда, время задержки сделал управляемым - через параметры запуска и через менюшку. Ksysguard показывает ощутимую разгрузку.
Спасибо за совет. Насчет кулера - подумаю относительно домашнего компа. Но вот своей студентке на ноут я не только кулер не смогу заменить, но и ядро менять не стану. Впрочем, и на своей машине ядро тоже трогать лишний раз неохота
2 Light13:
Насчет потоков - не очень понял, чтО это может дать, кроме возможности гибкого управления приоритетами. Но ежели ход расчетов надо выводить на экран, потоки все равно придется синхронизовать - ну, либо организовывать какой-то обмен сообщениями между потоками, что только добавит нагрузки.
2 Сквозняк:
Вот Sleep - это, кажется, работает. Я, правда, время задержки сделал управляемым - через параметры запуска и через менюшку. Ksysguard показывает ощутимую разгрузку.
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
Вот Sleep - это, кажется, работает. Я, правда, время задержки сделал управляемым - через параметры запуска и через менюшку. Ksysguard показывает ощутимую разгрузку.
Конечно будет работать, однако ценой кратного снижения скорости расчтов...
-
PVOzerski
- постоялец
- Сообщения: 109
- Зарегистрирован: 19.05.2005 13:45:10
- Откуда: СПб
- Контактная информация:
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
>однако ценой кратного снижения скорости расчтов
А что, есть варианты? Для двухъядерника, впрочем, возможно (за счет перераспределения нагрузки между ядрами) - а вот для одноядерного ноута я ничего другого придумать, пожалуй, не могу.
А что, есть варианты? Для двухъядерника, впрочем, возможно (за счет перераспределения нагрузки между ядрами) - а вот для одноядерного ноута я ничего другого придумать, пожалуй, не могу.
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
А что, есть варианты?
Думаю, ваща задача должна уметь динамически оценивать занимаемую ей полосу (или температуру разогрева) CPU (возможно настраиваемую) и по результататм оценки динамически подгонять аргумент Sleep-вызова.
Или, если у Вас новая видеокарта (fermini-семейство от NVidia и т.п.) - передавать часть рассчетов этой видеокарте ( через VDPAU или DirectCompute ).
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
А может стоит попытаться немного оптимизировать алгоритм расчётов?
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
Значит так, вот реальный совет
делаешь два потока. В одном вычисления без Sleep, как они есть.
Другой поток вспомогательный, занимается тем, что постоянно останавливает и запускает вновь основной поток.
Таким образом, меняя величины в двух вызовах sleep, можешь отрегулировать, сколько процессора будет заедать.
Если поставишь 10 после Pause и 90 после Resume, будет отъедать 90 процентов.
Я сам так делал, реальный способ!
делаешь два потока. В одном вычисления без 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:как бы мне разгрузить процессор?
Для двухъядерника, впрочем, возможно (за счет перераспределения нагрузки между ядрами)
Линукс сам будет переключать ядра - Вас не спросит
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
Вот именно, стоит написать программу, которая не использует паузы в работе, как одно из ядер оказывается постоянно забито работой под завязку. Например, сканирование нажатий клавиш без использования пауз, может и увеличит отзывчивость на микроскопическую величину, но в комнате станет ощутимо теплее. Уменьшение приоритета приложения уменьшит тормоза но на нагрузку процессора сильно не повлияет. На одноядернике обжору не заметно, но на двухъядернике шило в мешке утаить сложнее. А если количество таких приложений равно количеству ядер, то это просто ахтунг. В тяжёлых программах, работающих длительное время, должна быть функция ограничения потребляемой мощности а пользователь пусть сам решает, нужна ему максимальная скорость или нет. Если задача всё равно успеет просчитаться за ночь, то многих это устроит. Более того, снижение нагрузки на процессор это такой вид спорта - временно отключил жабу в броузере и наслажнайся уменьшением парникового эффекта на планете:)
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
Что нам говорит наука кибернетика?
-"Любую программу можно сократить хотя бы на одну команду".
-"Время выполнении любой программы можно сократить хотя бы на один такт".
Я бы копал в сторону вашего "тяжелого" алгоритма.
-"Любую программу можно сократить хотя бы на одну команду".
-"Время выполнении любой программы можно сократить хотя бы на один такт".
Я бы копал в сторону вашего "тяжелого" алгоритма.
Re: "Тажелая" программа в Linux:как бы мне разгрузить процессор?
vada писал(а):Что нам говорит наука кибернетика?
-"Любую программу можно сократить хотя бы на одну команду".
-"Время выполнении любой программы можно сократить хотя бы на один такт".
Я бы копал в сторону вашего "тяжелого" алгоритма.
Оптимизация алгоритма - путь, безусловно, верный, но если задача объективно тяжёлая, то проблемы нагрузки на процессор это не решит. Ну, будет программа работать не час, а 45 минут - нагрузка на процессор не уменьшится.
Т.е., вопрос разгрузки процессора (или выбора процессора/системы, устойчивых к длительным нагрузкам) - это одно, а вопрос оптимизации - совсем другое.
