Ответ 1
На самом деле, в некотором смысле эта проблема проще, чем проблема окраски графа, потому что решающая версия этой проблемы является частным случаем версии решения Комбинированного распределения регистров и инструкций Задача планирования (CRISP), которая проще решить, чем проблема окраски графа (по крайней мере, когда точное решение не требуется).
Решение этой проблемы можно сформулировать так: существует ли расписание, использующее не более m слотов памяти?
Сокращение до CRISP
Обратите внимание, что ниже я буду использовать терминологию из указанной статьи.
Для каждого node v в вашей проблеме допустим ввести в CRISP виртуальный регистр r v и команду x v, инструкция записывает в регистр r v и читает каждый регистр r u, соответствующий родительскому node u node v. Кроме того, для каждого ребра (u, v) DAG вводится ребро (x u, x v) в графике зависимостей CRISP. Время выполнения каждой команды равно 1, латентность каждого края зависимостей равна 0, а стоимость разлива равна ∞. Количество доступных физических регистров равно m.
Если в CRISP есть расписание на длительность не более, чем число узлов, то в исходной задаче есть соответствующее расписание, в котором используется не более m слотов памяти. Мы закончили.
Если память, используемая родителем, не может быть повторно использована детьми
Приведенная выше редукция предполагает, что память, используемая родителем, может повторно использоваться дочерними элементами, когда родитель больше не нужен. Если это не разрешено, необходимы следующие изменения:
Добавьте еще одну инструкцию y v для каждого node v. Теперь x v записывает только r v, а y v читает каждый r u, соответствующий родительскому u. Добавить границу графа зависимостей (x v, y v). Установите время выполнения каждой команды на 0,5. Это все.
Обратите внимание, что разделение записи регистров и чтения между различными инструкциями требуется для предотвращения повторного использования родительских регистров, когда это не разрешено.
Алгоритм
В статье, которая упоминается в начале, описывается эффективный алгоритм для решения CRISP. Он также может быть использован для решения этой проблемы — просто используйте приведенное выше сокращение и попробуйте каждый m, начиная с 1, пока не будет найдено решение.
Отметим также, что алгоритм параметризуется двумя параметрами: α и β, где α - вес для регулирования давления в регистре, а β - вес для команды управления parallelism. Для этой задачи установите α в 1 и β в 0, так как команда parallelism не нужна для этой проблемы.