demiurg_spb 0 21 августа, 2012 Опубликовано 21 августа, 2012 · Жалоба Сегодня попробовал задать мейку во сколько потоков ему работать, т.к. у меня в системе видятся 4 ядра (1+HT)*2 то я задал 4: make -j 4 all Результат: проект собрался ровно в 2 раза быстрее! Спешу поделиться своей радостью со всеми:-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 21 августа, 2012 Опубликовано 21 августа, 2012 · Жалоба Разделяем Вашу радость :) если задать число более чем число возможных потоков то еще быстрее будет по причине того что поточи часто блокируются подсистемой ввода вывода, и в это время отпускают процессорв. на малом числе не заметно, а вот если проект сложный то эффект без очков заметен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 21 августа, 2012 Опубликовано 21 августа, 2012 · Жалоба Спасибо за наводку! Проверил, у меня видимо не такой большой проект... При дальнейшем увеличении потов скорость сборки не изменяется, как была 18 секунд, так и остаётся. А можно-ли как-то из самого мейк-файла передавать мейк-утилите эту же информацию что и аргумент j? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 22 августа, 2012 Опубликовано 22 августа, 2012 · Жалоба Попробовал подобным образом сделать ребилд, т. е. make -j 2 clean all Получил следующую хохму - в одном потоке делалась компиляция, а в другом благополучно всё чистилось. Таким образом, когда дело дошло до линкера, то вылезла масса ошибок из-за нехватки объектных файлов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 22 августа, 2012 Опубликовано 22 августа, 2012 · Жалоба Всё. Последний аргумент перехода на scons. там это всё вручную планируется, с нужным результатом :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 22 августа, 2012 Опубликовано 22 августа, 2012 · Жалоба А можно-ли как-то из самого мейк-файла передавать мейк-утилите эту же информацию что и аргумент j?Из окружения (и на каждом компе своё), в переменной MAKEFLAGS (через эту же переменную передаются флаги «вложенным» вызовам $(MAKE) ) Получил следующую хохму - в одном потоке делалась компиляция, а в другом благополучно всё чистилось. Таким образом, когда дело дошло до линкера, то вылезла масса ошибок из-за нехватки объектных файлов. Так если в файловом менеджере запустить копирование какого-то каталога и тут же чразу его удаление, так тоже весело будет. Если на -j рассчитывать, то надо бы цель отдельную rebuild: $(MAKE) clean $(MAKE) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 22 августа, 2012 Опубликовано 22 августа, 2012 · Жалоба Если на -j рассчитывать, то надо бы цель отдельную rebuild: $(MAKE) clean $(MAKE) У меня была именно такая цель: build: clean all И всё равно с -j получилась ерунда - при первом вызове ничего не произошло (как будто всё up-to date), и лишь при втором начало-таки компилироваться. Но, что меня удивило больше - скорость компиляции визуально не изменилась. Поэтому я убрал -j, отложив многопоточную сборку до освоения scons (то есть до следующей жизни :) ). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryM 0 22 августа, 2012 Опубликовано 22 августа, 2012 · Жалоба eCos по умолчанию собирается -j 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 22 августа, 2012 Опубликовано 22 августа, 2012 · Жалоба Из окружения (и на каждом компе своё), в переменной 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 14 23 августа, 2012 Опубликовано 23 августа, 2012 · Жалоба А что за процессор в компьютере? Pentium dual-core 2GHz. Сейчас замерил с секундомером, разница-таки есть: 35 сек против 40. А с -j 2 - 30 сек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 23 августа, 2012 Опубликовано 23 августа, 2012 · Жалоба У меня была именно такая цель: build: clean all И всё равно с -j получилась ерунда - при первом вызове ничего не произошло (как будто всё up-to date), и лишь при втором начало-таки компилироваться. Конечно, цель-то таки ж не такая. Тут build зависит от двух других, которые могут и в разном порядке достигаться. Если сначала достигнется all (проверили — всё на месте) и только потом clean (пока то проверялось — составляли список чего тереть), то такой эфект и будет. Я привёл цель без зависимостей с двумя последовательными действиями, каждое из которых может распараллеливаться, но между ними «точка следования» :-) Сейчас на ноуте с i3 (два ядра по два потока) типовая команда make -j 4 program, ещё ни разу непоняток из-за кривого порядка не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 23 августа, 2012 Опубликовано 23 августа, 2012 · Жалоба Да, наверняка всё так и есть. Но мне это не нравится. Часто вижу варианты типа: all: message_begin elf size message_end Получается, что все эти варианты тоже будут глючить от многопоточности. Имхо, надо было и в такой перечень целей вставить «точки следования». Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 23 августа, 2012 Опубликовано 23 августа, 2012 · Жалоба AHTOXA +1 Любую переделку мейкфайлов считаю моветоном. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Petka 0 23 августа, 2012 Опубликовано 23 августа, 2012 · Жалоба Да, наверняка всё так и есть. Но мне это не нравится. Часто вижу варианты типа: all: message_begin elf size message_end Получается, что все эти варианты тоже будут глючить от многопоточности. Имхо, надо было и в такой перечень целей вставить «точки следования». Банальная безграмотность создателей таких make файлов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 23 августа, 2012 Опубликовано 23 августа, 2012 · Жалоба Банальная безграмотность создателей таких make файлов. Ой ли? Сдаётся мне, что ключ -j появился далеко не сразу. И к этому времени было уже очень много таких вот "безграмотных" мейкфайлов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться