Диспетчирование параллельных вычислительных систем
Диспетчер последовательного назначения для неоднородной ВС
В основе диспетчера лежит следующее решающее правило:
Введем сквозную нумерацию процессоров от 1 до . Зададим вес {tj1 ... tjN} j -й вершины (j = 1 ... m; m — размер матрицы S или объем буфера диспетчера) так, что при новой нумерации процессоров tjl — время выполнения j -й работы l -м процессором. Например, при k = 2, n1 = 1, n2 = 2 расширенная матрица следования на рис. 10.15б примет вид, представленный на рис. 10.16.
В процессе распределения работ будем формировать расписание в виде таблицы состоящей из N строк, каждая из которых соответствует одному процессору. В строке будем записывать последовательность заданий одному процессору. Задания имеют два вида: выполнить работу простоять t единиц времени (изображается ). Момент Ti , i = 1 ... N, окончания (отсчет ведется от нуля) выполнения последней работы или простоя, назначенных к данному моменту распределения i -му процессору, назовем текущим временем занятости процессора.
В процессе распределения и имитации выполнения работ будем использовать множество A номеров работ, уже назначенных на процессоры, но не выполненных в анализируемый момент времени. A представляет собой таблицу, содержащую пары "назначенная для выполнения задача — время окончания ее выполнения ", т.е. .
Множество R — множество работ, соответствующих не назначенным входам (нулевым строкам) текущего значения изменяемой матрицы следования S.
- Полагаем первоначально — номер шага распределения). Переходим к выполнению 5.
- Находим в множестве A значение tmu = minj {ti} и множество номеров работ, назначенных на процессоры и закончивших выполнение к моменту . Полагаем равными нулю все позиции A, составляющие B. Этим имитируется окончание выполнения работ на процессорах к моменту времени .
- Для всех процессоров, для которых текущее время занятости меньше значения , записываем простой в течение времени (символом простоя ). Для этих процессоров полагаем .
- Исключаем из строки и столбцы, соответствующие всем работам из B, после чего матрицу уплотним. Полагаем . Таким образом сформируется матрица (а также ) на новом шаге распределения.
- Находим множество R — входов матрицы следования , соответствующих не назначенным ранее работам. Если , переходим к выполнению 6, в противном случае выполняем пункт 2.
- Пусть для определенности , работе соответствует вес {tp1 ... tpN}, p = 1 ... r. Формируем суммы Tl + tpl , l = 1 ... N, p = 1 ... r. Для каждого значения p (т.е. для каждой работы из R ) находим минимальную (по l ) из таких сумм, т.е. для каждой работы находим один или несколько процессоров, на которых время окончания выполнения этой работы минимально при текущих значениях занятости процессоров. Найденные суммы сведем в невозрастающую последовательность R*, состоящую из r чисел. При этом сохраним информацию о соответствии процессорам.
- Ставим в соответствие каждой p -й работе, представленной в последовательности R*, значение , равное числу процессоров, при выполнении на которых достигается найденное минимальное время окончания выполнения этой работы.
- Производим последовательное назначение работ на процессоры следующим образом. Назначаем не более N работ слева направо в соответствии с вхождением времени окончания их выполнения в последовательность R*. Каждую p -ю работу назначаем на все те процессоры, (их число равно ), на которых достигается входящее в R* время окончания выполнения. В результате те работы, для которых , окажутся назначенными более чем на один процессор, а на один процессор на данном шаге могут оказаться назначенными более одной работы. Чтобы определить окончательно, на какой процессор должна быть назначена p -я работа, воспользуемся следующей процедурой. Для каждого процессора проводим анализ, сколько работ назначено на него на данном шаге распределения. Если назначения не произошло, переходим к анализу назначения на следующий процессор или заканчиваем анализ процессоров, если все они просмотрены. Если оказалась назначенной на процессор одна, p -я, работа, считаем ее окончательно закрепленной за данным процессором, и, если , исключаем ее из рассмотрения при анализе последующих процессоров — т.е., снимаем ее с назначения на другие процессоры. Если на процессор назначено более одной работы, закрепляем за процессором лишь ту работу , которая имеет минимальное значение . Если несколько работ имеют равное минимальное значение , назначаем любую (первую) из них. Для множества работ , отклоненных от назначения на данный процессор, полагаем . Значение означает, что работе отказано в назначении на данном шаге распределения. Назначенную работу исключаем из рассмотрения при анализе следующих процессоров. Номера назначенных работ оказываются записанными в строки таблицы соответствующие процессорам. Эти номера исключаем из R. Номер каждой назначенной работы и время окончания ее выполнения (оно же — время занятости процессора) заносим в A.
- Проверяем, все ли работы распределены. При отрицательном результате
проверки
переходим к выполнению 2.
Конец алгоритма.
При k = 2, n1 = 1, n2 = 2, (N = 3) распределим работы, отображенные расширенной матрицей следования на рис. 10.16 (соответствующей графу на рис. 10.15), для минимизации времени выполнения.
- . Выполнение работы 1 ранее всех закончит процессор 1. После ее назначения .
- Найдем в A работу 1 с минимальным временем окончания выполнения, равным 1. Записываем простои в одну единицу времени процессорам 2 и 3. Таблица принимает вид
-
После исключения первой строки и первого столбца из S1 (т.е. по матрице S2 ) найдем R = {2, 3, 4, 6}. Составим таблицу 10.1 времени окончания выполнения каждой работы из R каждым процессором l = 1, 2, 3. Минимальное время окончания выполнения каждой работы выделено.
Формируем последовательность , , где в круглых скобках указаны номер работы, список процессоров, на которых достигается минимальное время окончания ее выполнения, и число этих процессоров.
Назначим первоначально (таблица 10.2) работу 4 на процессоры 1, 2, 3, работу 2 — на процессоры 2 и 3 , работу 3 — на процессор 1.
После анализа значений оставим на процессоре 1 работу 3 (после чего ), на процессоре 2 — работу 4 (после чего ), на процессоре 3 — работу 2, . Таблица распределения примет вид
-
B = {2, 3}. После исключения строк и столбцов, соответствующих работам 2 и 3, из матрицы S2, т.е. по сформированной матрице S3, найдем R = {5, 6}. Составим таблица 10.3 значений времени окончания выполнения каждой работы из R каждым процессором.
Из таблицы найдем ,
Назначим работу 5 на процессор 1, работу 6 — на процессор 3, . Таблица распределения примет вид
-
B = {6}. После исключения строки и столбца, соответствующих работе 6, из матрицы следования S3, т.е. по сформированной матрице S4, найдем . Назначим процессору 3 простой в течение одной условной единицы времени. Таблица примет вид
-
B = {5}. После преобразования матрицы S4, т.е. по матрице S5, найдем R = {7, 8}. Из таблицы 10.4, аналогичной таблице 3, найдем
Назначаем работу 8 на процессор 1, работу 7 — на процессор 3. Таблица примет вид
-
B = {4}. После исключения строки и столбца, соответствующих работе 4, из матрицы следования S5, т.е. по сформированной при этом матрице S6, найдем R = {9}. Время окончания выполнения работы 9 на процессорах равно соответственно 10, 8, 9. Назначаем работу 9 на процессор 2. Таблица примет окончательный вид
Данный диспетчер для неоднородной ВС построен на основе обобщения рассмотренного диспетчера последовательного назначения для однородных ВС, который можно рассматривать как частный случай при k = 1.
Он применим и в другом частном случае: когда отсутствует частичная упорядоченность работ, то есть когда надо разделить "поровну" взаимно независимые работы между n исполнителями. Наглядный пример такого распределения составляет задача о рюкзаках, рассмотренная в разделе 10.1.1.