реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Make, ускорение процесса сборки проектов
demiurg_spb
сообщение Aug 21 2012, 17:25
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Сегодня попробовал задать мейку во сколько потоков ему работать, т.к. у меня в системе видятся 4 ядра (1+HT)*2 то я задал 4:
Код
make -j 4 all

Результат: проект собрался ровно в 2 раза быстрее!

Спешу поделиться своей радостью со всеми:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
klen
сообщение Aug 21 2012, 19:15
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



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

Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 21 2012, 19:39
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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

А можно-ли как-то из самого мейк-файла передавать мейк-утилите эту же информацию что и аргумент j?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 22 2012, 06:42
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Попробовал подобным образом сделать ребилд, т. е.
Код
make -j 2 clean all

Получил следующую хохму - в одном потоке делалась компиляция, а в другом благополучно всё чистилось. Таким образом, когда дело дошло до линкера, то вылезла масса ошибок из-за нехватки объектных файлов. biggrin.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 22 2012, 07:14
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(IgorKossak @ Aug 22 2012, 09:42) *

Всё. Последний аргумент перехода на scons.
там это всё вручную планируется, с нужным результатом sm.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 22 2012, 12:25
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(demiurg_spb @ Aug 21 2012, 22:39) *
А можно-ли как-то из самого мейк-файла передавать мейк-утилите эту же информацию что и аргумент j?
Из окружения (и на каждом компе своё), в переменной MAKEFLAGS
(через эту же переменную передаются флаги «вложенным» вызовам $(MAKE) )


Цитата(IgorKossak @ Aug 22 2012, 09:42) *
Получил следующую хохму - в одном потоке делалась компиляция, а в другом благополучно всё чистилось. Таким образом, когда дело дошло до линкера, то вылезла масса ошибок из-за нехватки объектных файлов. biggrin.gif
Так если в файловом менеджере запустить копирование какого-то каталога и тут же чразу его удаление, так тоже весело будет.

Если на -j рассчитывать, то надо бы цель отдельную
Код
rebuild:
    $(MAKE) clean
    $(MAKE)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 22 2012, 15:44
Сообщение #7


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ReAl @ Aug 22 2012, 18:25) *
Если на -j рассчитывать, то надо бы цель отдельную
Код
rebuild:
    $(MAKE) clean
    $(MAKE)

У меня была именно такая цель:
Код
build: clean all

И всё равно с -j получилась ерунда - при первом вызове ничего не произошло (как будто всё up-to date), и лишь при втором начало-таки компилироваться.
Но, что меня удивило больше - скорость компиляции визуально не изменилась. Поэтому я убрал -j, отложив многопоточную сборку до освоения scons (то есть до следующей жизни sm.gif ).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Aug 22 2012, 19:10
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



eCos по умолчанию собирается -j 4
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 22 2012, 20:14
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ReAl @ Aug 22 2012, 16:25) *
Из окружения (и на каждом компе своё), в переменной MAKEFLAGS...
То что надо, спасибо!

У меня для сборки всех конфигураций понаписаны батники типа этого (в таком варианте гонки целей исключены, но хотелось бы более элегантное решение найти):
Код
set MAKEFLAGS=-j 4
for /L %%i in (0#,1#,36#) do (
    call make.exe clean    --quiet COMPILE_TYPE=%%i
    if ERRORLEVEL 1 goto ERROR     
    call make.exe all      --quiet COMPILE_TYPE=%%i
    if ERRORLEVEL 1 goto ERROR     
    call make.exe clean    --quiet COMPILE_TYPE=%%i
    if ERRORLEVEL 1 goto ERROR     
    call make.exe boot_all --quiet COMPILE_TYPE=%%i
    if ERRORLEVEL 1 goto ERROR     
)
goto EOF
:ERROR
echo  Compilation error!
pause
exit
:EOF
Эффект от многопоточной сборки значительный: вместо 13 минут всё за 7 минут пересобирается.
И чем больше исходников в проекте тем эффект более выражен.
Цитата(AHTOXA @ Aug 22 2012, 19:44) *
Но, что меня удивило больше - скорость компиляции визуально не изменилась.
А что за процессор в компьютере?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 23 2012, 05:11
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(demiurg_spb @ Aug 23 2012, 02:14) *
А что за процессор в компьютере?

Pentium dual-core 2GHz.
Сейчас замерил с секундомером, разница-таки есть: 35 сек против 40. А с -j 2 - 30 сек.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 23 2012, 06:50
Сообщение #11


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(AHTOXA @ Aug 22 2012, 18:44) *
У меня была именно такая цель:
Код
build: clean all

И всё равно с -j получилась ерунда - при первом вызове ничего не произошло (как будто всё up-to date), и лишь при втором начало-таки компилироваться.
Конечно, цель-то таки ж не такая.
Тут build зависит от двух других, которые могут и в разном порядке достигаться. Если сначала достигнется all (проверили — всё на месте) и только потом clean (пока то проверялось — составляли список чего тереть), то такой эфект и будет.

Я привёл цель без зависимостей с двумя последовательными действиями, каждое из которых может распараллеливаться, но между ними «точка следования» :-)

Сейчас на ноуте с i3 (два ядра по два потока) типовая команда make -j 4 program, ещё ни разу непоняток из-за кривого порядка не было.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 23 2012, 07:53
Сообщение #12


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Да, наверняка всё так и есть. Но мне это не нравится.
Часто вижу варианты типа:
Код
all: message_begin elf size message_end

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 23 2012, 08:02
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



AHTOXA
+1
Любую переделку мейкфайлов считаю моветоном.
Go to the top of the page
 
+Quote Post
Petka
сообщение Aug 23 2012, 08:52
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(AHTOXA @ Aug 23 2012, 11:53) *
Да, наверняка всё так и есть. Но мне это не нравится.
Часто вижу варианты типа:
Код
all: message_begin elf size message_end

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

Банальная безграмотность создателей таких make файлов.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 23 2012, 10:28
Сообщение #15


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Petka @ Aug 23 2012, 14:52) *
Банальная безграмотность создателей таких make файлов.

Ой ли? Сдаётся мне, что ключ -j появился далеко не сразу. И к этому времени было уже очень много таких вот "безграмотных" мейкфайлов.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01517 секунд с 7
ELECTRONIX ©2004-2016