Задания № 13, 16 · ЕГЭ

Основы параллельных вычислений

Как распределять независимые задачи и находить минимальное время выполнения
6 мин чтенияСложность: Обновлено 29 сентября 2026

Параллельные вычисления позволяют выполнять несколько независимых задач одновременно на разных исполнителях. В этой теме научимся распределять работы между исполнителями, вычислять время расписания и понимать, когда ускорение ограничено самой длиной задачи.

Модель параллельных вычислений

Пусть есть \(n\) независимых задач с длительностями \(t_1,t_2,\ldots,t_n\) и \(k\) одинаковых исполнителей. Исполнитель может выполнять только одну задачу в каждый момент времени. Если задача уже начата, обычно предполагается, что её не прерывают и не переносят на другого исполнителя.

D
Параллельная задача

Параллельная задача — это набор работ, которые можно выполнять одновременно на нескольких исполнителях. Задачи называются независимыми, если начало одной задачи не зависит от окончания другой.

Результат распределения задач называют расписанием. В нём для каждой задачи указано, какой исполнитель её выполняет и в какой момент она начинается. В простейшей модели все исполнители доступны в момент \(0\), передача данных и переключение между задачами не занимают времени.

И1И2И302345
Пример временной диаграммы: задачи выполняются параллельно на трёх исполнителях.

Время расписания и нижние границы

Время окончания всего набора задач равно моменту, когда завершилась последняя задача. Его называют длиной расписания или временем выполнения \(T\). Для каждого исполнителя складываются длительности назначенных ему задач, а \(T\) равен наибольшей из получившихся сумм.

\[T=\max(S_1,S_2,\ldots,S_k),\qquad S_j=\sum_{i\in A_j}t_i\]1

Здесь \(A_j\) — множество задач, назначенных исполнителю \(j\), а \(S_j\) — его суммарная занятость. Чем меньше максимальная загрузка, тем быстрее расписание.

T
Две нижние границы

Для любого расписания справедливо \(T\ge\max(t_1,\ldots,t_n)\): самую длинную задачу нельзя выполнить быстрее её длительности. Кроме того, \(T\ge\frac{t_1+\cdots+t_n}{k}\), потому что исполнители вместе могут выполнить не более \(kT\) единиц работы.

\[T\ge T_{\min\,bound}=\max\left(\max_i t_i,\frac{\sum_{i=1}^{n}t_i}{k}\right)\]2

Если сумма длительностей делится на \(k\) и задачи удаётся распределить с одинаковой загрузкой, нижняя граница достигается. Тогда расписание оптимально. Но равенство может быть невозможно: крупные задачи приходится сочетать с мелкими, и один исполнитель может оказаться загружен дольше остальных.

Практический алгоритм распределения

Для небольшого числа задач можно перебрать варианты распределения. На экзамене чаще применяют жадное правило: сортируют задачи по убыванию длительности и каждую следующую задачу назначают исполнителю с наименьшей текущей загрузкой. Такой способ называется правилом «сначала самые длинные».

  1. Запишите длительности задач и упорядочьте их по убыванию.
  2. Для каждой задачи найдите исполнителя с минимальной текущей суммой.
  3. Прибавьте длительность задачи к его загрузке.
  4. После распределения возьмите максимальную загрузку.
Как быстро проверять оптимальность

Сначала вычислите нижнюю границу по формуле (2). Затем постройте расписание. Если его длина совпала с нижней границей, улучшить его нельзя: расписание оптимально.

Микропроверка

Есть 2 исполнителя и задачи длительностью 8, 7, 4 и 3. Какова нижняя граница времени выполнения?

Разобранный пример

Есть 3 исполнителя и 7 независимых задач длительностью \(9,8,7,6,5,4,3\). Требуется получить как можно меньшее время выполнения.

№
Решение по шагам

Сначала найдём нижнюю границу, затем применим жадное распределение.

1
Складываем длительности всех задач.
9+8+7+6+5+4+3=42
2
Сравниваем среднюю работу на исполнителя с самой длинной задачей.
\(\displaystyle \frac{42}{3}=14,\qquad \max(9,14)=14\)
3
Назначаем задачи по убыванию на наименее загруженного исполнителя: 9, 8 и 7 идут разным исполнителям.
\(\displaystyle S_1=9,\quad S_2=8,\quad S_3=7\)
4
Задачу 6 назначаем исполнителю с загрузкой 7, затем 5 — исполнителю с загрузкой 8, а 4 — исполнителю с загрузкой 9.
\(\displaystyle S_1=9+4=13,\quad S_2=8+5=13,\quad S_3=7+6=13\)
5
Последнюю задачу 3 назначаем любому исполнителю.
\(\displaystyle S_1=16,\quad S_2=13,\quad S_3=13\)
6
Длина расписания равна максимальной загрузке.
\(\displaystyle T=\max(16,13,13)=16\)

Получилось расписание длиной 16, но нижняя граница равна 14. Значит, жадное распределение здесь не доказало оптимальность и его можно улучшить. Переберём сочетания: исполнитель 1 получает \(9+5=14\), исполнитель 2 — \(8+6=14\), исполнитель 3 — \(7+4+3=14\).

\[T=\max(9+5,\;8+6,\;7+4+3)=14\]3

Время 14 совпадает с нижней границей. Следовательно, это оптимальное расписание: ни один способ не может завершить все задачи раньше 14 единиц времени.

Ограничения и зависимости

Если задачи нельзя начинать произвольно, необходимо учитывать зависимости между задачами. Например, задача B может стартовать только после окончания A. Тогда одной суммы длительностей недостаточно: важна самая длинная цепочка зависимых задач — критический путь.

При наличии зависимостей сначала строят расписание параллельных вычислений с учётом разрешённых порядков. Для полностью независимых задач порядок не важен, поэтому достаточно балансировать загрузку исполнителей. Если некоторые задачи нельзя разделить или одна задача длится дольше всей средней нагрузки, ускорение ограничено.

!
Частые ошибки

1. Делить сумму длительностей на число исполнителей и сразу считать ответом: это только нижняя граница. 2. Забывать о самой длинной задаче. 3. Складывать времена всех исполнителей вместо максимального. 4. Распределять задачи поровну по количеству, а не по суммарной длительности. 5. Игнорировать зависимости и запускать задачу до готовности её исходных данных.

Полезно отличать распределение задач от оптимизации параллельных вычислений. Распределение отвечает на вопрос «кто выполняет работу», а оптимизация также учитывает накладные расходы, обмен данными и неравномерность загрузки.

Оценка ускорения

Если все задачи выполнялись последовательно, время равно \(T_1=\sum t_i\). При \(k\) исполнителях время равно \(T_k\). Ускорение показывает, во сколько раз вычисление стало быстрее.

\[\text{Ускорение }P=\frac{T_1}{T_k}\]4

Теоретически ускорение не может быть больше \(k\), потому что имеется только \(k\) исполнителей. На практике оно меньше из-за длинных задач, простоев и зависимостей. Поэтому важно не только число исполнителей, но и возможность равномерно разделить работу.

Запомнить

Для независимых задач: сумма длительностей даёт общий объём работы, максимум загрузок даёт время расписания, а нижняя граница равна максимуму из длительности самой длинной задачи и средней работы на одного исполнителя.

Q
Быстрый тест по теме

Проверь себя

~ 2 мин4 вопроса
Вопрос 1 / 4
Вопрос 1 из 4 · время
Четыре задачи имеют длительности 6, 5, 4 и 3. Два исполнителя получили группы 6+3 и 5+4. Каково время расписания?
Главное за минуту

Кратко

  • Независимые задачи можно выполнять одновременно на разных исполнителях.
  • Время расписания — максимальная сумма длительностей задач, назначенных одному исполнителю.
  • Нижняя граница: \(T\ge\max(\max_i t_i,\sum t_i/k)\).
  • Жадное правило: сортировать задачи по убыванию и добавлять каждую к наименее загруженному исполнителю.
  • Совпадение времени расписания с нижней границей доказывает оптимальность.
  • При зависимостях нужно учитывать порядок запуска и критический путь.