Jump to content

    

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

make -j 4 all

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

 

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

 

Share this post


Link to post
Share on other sites

Разделяем Вашу радость :)

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

 

 

Share this post


Link to post
Share on other sites

Спасибо за наводку!

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

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

 

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

Share this post


Link to post
Share on other sites

Попробовал подобным образом сделать ребилд, т. е.

make -j 2 clean all

Получил следующую хохму - в одном потоке делалась компиляция, а в другом благополучно всё чистилось. Таким образом, когда дело дошло до линкера, то вылезла масса ошибок из-за нехватки объектных файлов. :biggrin:

Share this post


Link to post
Share on other sites

Всё. Последний аргумент перехода на scons.

там это всё вручную планируется, с нужным результатом :)

Share this post


Link to post
Share on other sites
А можно-ли как-то из самого мейк-файла передавать мейк-утилите эту же информацию что и аргумент j?
Из окружения (и на каждом компе своё), в переменной MAKEFLAGS

(через эту же переменную передаются флаги «вложенным» вызовам $(MAKE) )

 

 

Получил следующую хохму - в одном потоке делалась компиляция, а в другом благополучно всё чистилось. Таким образом, когда дело дошло до линкера, то вылезла масса ошибок из-за нехватки объектных файлов. :biggrin:
Так если в файловом менеджере запустить копирование какого-то каталога и тут же чразу его удаление, так тоже весело будет.

 

Если на -j рассчитывать, то надо бы цель отдельную

rebuild:
    $(MAKE) clean
    $(MAKE)

Share this post


Link to post
Share on other sites
Если на -j рассчитывать, то надо бы цель отдельную

rebuild:
    $(MAKE) clean
    $(MAKE)

У меня была именно такая цель:

build: clean all

И всё равно с -j получилась ерунда - при первом вызове ничего не произошло (как будто всё up-to date), и лишь при втором начало-таки компилироваться.

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

 

Share this post


Link to post
Share on other sites
Из окружения (и на каждом компе своё), в переменной 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 минут пересобирается.

И чем больше исходников в проекте тем эффект более выражен.

Но, что меня удивило больше - скорость компиляции визуально не изменилась.
А что за процессор в компьютере?

Share this post


Link to post
Share on other sites
А что за процессор в компьютере?

Pentium dual-core 2GHz.

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

Share this post


Link to post
Share on other sites
У меня была именно такая цель:

build: clean all

И всё равно с -j получилась ерунда - при первом вызове ничего не произошло (как будто всё up-to date), и лишь при втором начало-таки компилироваться.

Конечно, цель-то таки ж не такая.

Тут build зависит от двух других, которые могут и в разном порядке достигаться. Если сначала достигнется all (проверили — всё на месте) и только потом clean (пока то проверялось — составляли список чего тереть), то такой эфект и будет.

 

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

 

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

Share this post


Link to post
Share on other sites

Да, наверняка всё так и есть. Но мне это не нравится.

Часто вижу варианты типа:

all: message_begin elf size message_end

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

Share this post


Link to post
Share on other sites

AHTOXA

+1

Любую переделку мейкфайлов считаю моветоном.

Share this post


Link to post
Share on other sites
Да, наверняка всё так и есть. Но мне это не нравится.

Часто вижу варианты типа:

all: message_begin elf size message_end

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

Банальная безграмотность создателей таких make файлов.

Share this post


Link to post
Share on other sites
Банальная безграмотность создателей таких make файлов.

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this