GNU make - как моделировать несколько одновременных заданий

Я знаю, что для того, чтобы make был многопоточным, я использую команду make --jobs=X, где X обычно равно количеству ядер (или в два раза больше или что-то еще).

Я отлаживаю make-файл - на самом деле он состоит из множества make-файлов - для работы с опцией --jobs=X. Вот пример того, почему в настоящее время этого не происходит:

T1:
  mkdir D1
  output_makefile.bat > ./D1/makefile
T2:
  cd D1
  make

Выполнение этого с помощью --jobs=X приведет к состоянию гонки, потому что T1 не указан как зависимость от T2, и в конечном итоге T2 будет построен раньше T1; большинство ошибок, которые мне нужно исправить, относятся к этой разновидности.

Если X в --jobs=X больше, чем число «логических или физических»? ядер, количество одновременно выполняемых заданий будет ограничено числом «логических или физических». ядра.

Моя машина имеет 4 физических / 8 логических ядер, но машина сборки, на которой будут выполняться наши сборки, будет иметь до 64 ядер.

Поэтому меня беспокоит то, что тот факт, что мой make-файл (a) правильно формирует окончательный результат (b) работает без ошибок на моей машине с --jobs=4, не означает, что он будет работать правильно и без ошибок с --jobs=64 на 64-ядерной машине.

Есть ли инструмент, который будет имитировать make выполнение в среде с большим количеством ядер, чем физический компьютер?

Как насчет создания виртуальной машины с 64 ядрами и запуска ее на моей 4-ядерной машине; это вообще разрешено VMPlayer?

ОБНОВЛЕНИЕ 1

Я понял, что мое понимание make было неверным: количество слотов заданий make created равно аргументу --jobs=N, а не количеству ядер или потоков, которые имеет мой компьютер.

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

Мне нужно подтвердить, что ВСЕ задания выполняются параллельно, а не просто «поставлены в очередь» и ждут завершения активно выполняемых заданий.

Итак, я создал make-файл с 16 целями - больше, чем количество потоков или ядер, которые у меня есть, - и каждый рецепт просто echos имя цели настраиваемое количество раз.

make.mk

all: 1 2 3 4 ... 14 15 16

<target X>:
    @loop_output.bat $@

loop_output.bat

@FOR /L %%G IN (1,1,2048) DO @echo (%1-%%G)

Результат будет примерно таким:

(16-1)   <-- Job 16
(6-1400)
(12-334)
(1-1616) <-- Job 1
(4-1661)
(15-113)
(11-632)
(2-1557)
(10-485)
(7-1234)
(5-1530)

Формат - Job#X-Echo#Y. Тот факт, что я вижу (1-1616) после (16-1), означает, что make действительно выполняет цель 16 одновременно с целью 1.

Альтернативой является то, что make завершает задания (1- # ядер / потоков), а затем берет другой кусок заданий, равный # количеству ядер / потоков, но это не то, что происходит.


person Bob    schedule 09.06.2016    source источник
comment
Почему бы не использовать естественные способности Make по обработке зависимостей для предотвращения состояний гонки?   -  person Beta    schedule 10.06.2016
comment
количество одновременно выполняемых заданий будет ограничено числом «логических или физических». ядра. Такой гарантии нет, вы просто пробовали _1 _ / _ 2_ на своей машине?   -  person user657267    schedule 10.06.2016
comment
@Beta make может обрабатывать только те зависимости, о которых вы ей рассказываете. В приведенном выше примере он НЕ проверяет рецепты и делает вывод, что T2 зависит от T1. Такой вывод предоставляется с помощью Huddle от Electric-Cloud, и я его использую, и это потрясающе. Но это не бесплатно.   -  person Bob    schedule 10.06.2016
comment
Вы можете изучить рецепты, определить зависимости и добавить предварительные условия. Разве это не то, что означает отладка make-файла?   -  person Beta    schedule 10.06.2016
comment
@Beta, а затем я должен тщательно протестировать его, каким-то образом выполняя произвольное количество заданий одновременно, то есть независимо от количества ядер, которые у меня есть. Об этом и спрашивает мой вопрос.   -  person Bob    schedule 10.06.2016
comment
@ user657267 да, вы правы; смотри мое обновление.   -  person Bob    schedule 10.06.2016
comment
Какой был ваш вопрос в итоге?   -  person Johan Boulé    schedule 06.06.2019


Ответы (1)


См. Мое «ОБНОВЛЕНИЕ 1»:

Никакого специального программного обеспечения или make трюков не требуется. Независимо от количества ядер, которое у вас есть, Make будет выполнять задания по-настоящему параллельно, порождая несколько процессов и позволяя ОС выполнять многозадачность, как и любой другой процесс.

Windows PITFALL # 1: Версия Gnu Make, доступная на SourceForge, - 3.81, которая НЕ имеет возможности даже запускаться с использованием --jobs. Вам нужно будет загрузить версию 4.2 и собрать ее.

>

Windows PITFALL №2: make 4.2 исходный код не будет создан из-за некоторого заголовка, которого нет в VS2008 (и более ранних версиях). Исправить это просто: вам нужно заменить вызов «символа не найден» на его макроэквивалент; когда вы пытаетесь его построить, должно быть очевидно, о чем я говорю. (Я забыл, что это за пропавший символ).

person Bob    schedule 10.06.2016