Я знаю, что для того, чтобы 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- # ядер / потоков), а затем берет другой кусок заданий, равный # количеству ядер / потоков, но это не то, что происходит.
make
может обрабатывать только те зависимости, о которых вы ей рассказываете. В приведенном выше примере он НЕ проверяет рецепты и делает вывод, чтоT2
зависит отT1
. Такой вывод предоставляется с помощью Huddle от Electric-Cloud, и я его использую, и это потрясающе. Но это не бесплатно. - person Bob   schedule 10.06.2016