У меня следующее makefile
.
Я хочу, чтобы step0
запускался, тогда я хочу, чтобы все сценарии b*.R
запускали в то же время в step1
. Когда step1
завершится, я хочу final
бежать.
Когда я запускаю make
или make -j 8
, кажется, что все файлы b*.R
продолжают работать последовательно. Это makefile
правильно настроено для одновременного запуска всех b*.R
файлов? Если нет, то что мне нужно изменить.
final : step1
Rscript c.R
step1 : step0
Rscript b1.R
Rscript b2.R
Rscript b3.R
Rscript b4.R
Rscript b5.R
Rscript b6.R
step0 :
Rscript a.R
Если вы хотите, чтобы make выполнял за вас параллелизм, вам нужно реструктурировать make-файл, чтобы он имел другие цели. Например:
step1: b1 b2 b3 b4 b5 b6
b1: step0
Rscript b1.R
b2: step0
Rscript b2.R
...
step0 :
Rscript a.R
Или вы можете позволить оболочке выполнить параллелизм и написать:
step1: step0
Rscript b1.R & Rscript b2.R & \
Rscript b3.R & ... & wait
Я бы рекомендовал первое.
When I run make or make -j 8 it seems like all of the b*.R files still run sequentially.
-jN
допускает параллельное выполнение разные рецепты, а не отдельных команд, составляющих рецепт.
Таким образом, makefile должен быть реструктурирован следующим образом:
.PHONY: final b1 b2 b3 b4 b5 b6 step0
final: b1 b2 b3 b4 b5 b6
b1 b2 b3 b4 b5 b6: step0
b1: ;Rscript b1.R
b2: ;Rscript b2.R
b3: ;Rscript b3.R
b4: ;Rscript b4.R
b5: ;Rscript b5.R
b6: ;Rscript b6.R
step0: ;Rscript a.R
Итак, похоже, что ключевая строка здесь final: b1 b2 b3 b4 b5 b6
, что означает, что все b*
цели необходимы для final
запуска? Кроме того, .PHONY
необходимо? Кроме того, будут ли файлы b
запускаться одновременно, даже если не указано -jN
?
@Alex (1) Это называется «предпосылки». Любая предпосылка автоматически становится также целью, которая проверяется и, при необходимости, (пере)составляется перед первоначальной целью. (2) .PHONY говорит make, что следующие цели не являются реальными файлами, поэтому make никогда не утруждает себя проверкой их существования на диске, а просто выполняет соответствующие рецепты; это необходимо или нет, зависит от вашей настройки. (3) Нет, без -jN они выполняются последовательно слева направо (если между ними нет дополнительных зависимостей).
step1: step0 b1 b2 b3 b4 b5 b6
Это неправильно, так какstep0
не гарантируется, что она завершится до того, какb1
запустится.