Может ли GNU Сделать параллельное задание знать, в каком слоте параллельного задания он работает? (то есть для -j 50, индекс в диапазоне 0..49) - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь использовать GNU make для параллельного запуска старого кода (скажем, 50 или 100 экземпляров одновременно); но из-за устаревшей проблемы с ресурсами ( sigh ) каждый параллельный экземпляр должен выполняться в отдельном каталоге.

Поэтому я хотел бы использовать -j 50, но где:

  • задание № 0 выполняется в каталоге 0
  • задание № 1 выполняется в каталоге 1
  • задание № 2 выполняется в каталоге 2 и т. Д. c

I Я вижу ужасные способы достижения этого (я работаю под Windows 10), но нет хорошего пути. : - (

Предлагает ли GNU make какой-либо механизм, который данное параллельное задание может использовать для определения индекса слота задания, в котором оно выполняется?

Ответы [ 2 ]

1 голос
/ 28 января 2020

Вы можете обернуть его в GNU Parallel следующим образом:

parallel 'cd subdir{} && make' ::: {1..50}

Если вы хотите увидеть, что он будет делать, фактически ничего не делая, добавьте параметр --dry-run:

parallel --dry-run 'cd subdir{} && make' ::: {1..10}

Пример вывода

cd subdir1 && make
cd subdir2 && make
cd subdir3 && make
cd subdir4 && make
cd subdir5 && make
cd subdir6 && make
cd subdir7 && make
cd subdir8 && make
cd subdir9 && make
cd subdir10 && make

Или, если вы хотите указать подкаталоги в качестве параметров:

parallel 'cd {} && make' ::: subdir*
0 голосов
/ 28 января 2020

Вы, вероятно, можете легко подделать его с помощью make-файла оболочки.

Допустим, вы хотите запустить make-файл (скажем, Make.slow) тысячу раз, каждый раз с другим параметром и каждый раз в другом папка.

jobs := $(shell seq 1 1000)

.PHONY: all
all: ${jobs} ; : $@ Success

.PHONY: ${jobs}
${jobs}:
    mkdir -p _$@
    ${MAKE} -C _$@ -f ../Make.slow jobno=$@

Если у вас 48 процессоров

$ make -j49 all

В итоге вы получите 1000 папок _1, _2_1000. В каждом из них Make.old выполнялся бы с jobno , установленным на число, закодированное в имени папки.

...