Вот небольшая иллюстрация моего вопроса:
Предположим, что задание на сборку состоит из 4 независимых задач с именем AD. D занимает больше времени, чем AC в сумме.
Система сборки, которая не может включать относительное время выполнения задачи, может планировать задачи следующим образом:
---------------------------------------
CPU1: A | C |
---------------------------------------
CPU2: B | D |
---------------------------------------
Напротив, если планировщик знает о различиях времени задачи, он может придумать гораздо более короткий график:
---------------------------------------
CPU1: A | B | C |
---------------------------------------
CPU2: D |
---------------------------------------
Мои вопросы:
- Существуют ли системы сборки, которые включают в график относительное ожидаемое время выполнения задачи?
- Какие существуют научные исследования в области систем такого типа?
- Откуда эти системы сборки (если они существуют) получают информацию о времени? Эвристика, тайминги собранные во время предыдущих сборок?
- Если таких систем сборки не существует, почему? Есть ли гоча, которая сделает их менее ценными, чем кажется на первый взгляд?
scheduling
research
build-system
sjakobi
источник
источник
Ответы:
Microsoft Visual Studio Team System (ранее TFS) учитывает время сборки и параллельные сборки; он берет данные из предыдущей истории сборки; и хотя я не верю, что вы можете получить желаемое поведение из коробки, вы можете настроить его.
Пример некоторых пользовательских задач для работы по оптимизации производительности
https://veegens.wordpress.com/2013/03/26/tfs-2010-build-performance-report/
источник
Это основано на неправильном предположении, что «построение» задачи не является параллельным.
Многие компиляторы работают многопоточно, поэтому одна задача A будет использовать все процессоры. Поэтому порядок не имеет значения. Для задач, связанных с вводом / выводом, особенно связанных с сетью, лучше начинать их все параллельно с самого начала: большая часть времени будет потрачена на ожидание ответа.
Другими словами, порядок не имеет значения, поскольку отдельные задачи обычно распараллеливаются (например, при компиляции).
Редактировать:
На самом деле, эта концепция «Задача А на ЦП 1» тоже ошибочна. Даже для однопоточных задач ОС, планируя процессы / потоки, может перепрыгивать его с ЦП на ЦП при каждом переключении контекста. Я предполагаю, что большинство систем сборки будут просто выполнять все задачи параллельно и позволять ОС выполнять планирование. Более длинные задачи займут больше времени, и это все.
Предполагая, что у вас есть долго выполняющаяся однопотоковая задача, которая не привязана к вводу / выводу , для системы сборки было бы гораздо проще назначить ей приоритет / важность, чем пытаться отложить более мелкие задачи, чтобы уменьшить переключение контекста из ОС.
Даже если у вас есть такие странные задачи, что довольно редко встречается на практике, и у вас есть причудливая система построения расписаний, которая работает на эвристике, основанной на предыдущих запусках (единственный способ узнать), выгоды, которые вы получаете от этого, могут быть довольно небольшими. Однако вы получаете кучу дополнительных сложностей в обслуживании.
источник
make -j
) может запускать несколько процессов компиляции параллельно.-j <nb-cores>
но, к сожалению, по умолчанию все равно «1» ... Я все еще удивлен, что это никогда не менялось.