Опубликован: 22.12.2006 | Доступ: свободный | Студентов: 1216 / 120 | Оценка: 4.73 / 4.45 | Длительность: 18:17:00
ISBN: 978-5-94774-546-7
Специальности: Программист
Лекция 10:

Диспетчирование параллельных вычислительных систем

< Лекция 9 || Лекция 10: 1234 || Лекция 11 >

Диспетчер последовательного назначения для неоднородной ВС

В основе диспетчера лежит следующее решающее правило:

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

Введем сквозную нумерацию процессоров от 1 до N = \sum_{i=1}^k
n_i. Зададим вес {tj1 ... tjN} j -й вершины (j = 1 ... m; m — размер матрицы S или объем буфера диспетчера) так, что при новой нумерации процессоров tjl — время выполнения j -й работы l -м процессором. Например, при k = 2, n1 = 1, n2 = 2 расширенная матрица следования на рис. 10.15б примет вид, представленный на рис. 10.16.

В процессе распределения работ будем формировать расписание в виде таблицы \tau, состоящей из N строк, каждая из которых соответствует одному процессору. В строке будем записывать последовательность заданий одному процессору. Задания имеют два вида: выполнить работу \alpha, простоять t единиц времени (изображается \ubox{t} ). Момент Ti , i = 1 ... N, окончания (отсчет ведется от нуля) выполнения последней работы или простоя, назначенных к данному моменту распределения i -му процессору, назовем текущим временем занятости процессора.

В процессе распределения и имитации выполнения работ будем использовать множество A номеров работ, уже назначенных на процессоры, но не выполненных в анализируемый момент времени. A представляет собой таблицу, содержащую пары "назначенная для выполнения задача — время окончания ее выполнения ", т.е. A = \{ \alpha _{j} \leftrightarrow t_{j}\}.

Множество R — множество работ, соответствующих не назначенным входам (нулевым строкам) текущего значения изменяемой матрицы следования S.

Алгоритм диспетчера

  1. Полагаем первоначально T_{l} = 0, l = 1, \dots  N, A = B = R =\varnothing  ,  \nu  = 1, S_{\nu } = S,(\nu — номер шага распределения). Переходим к выполнению 5.
  2. Находим в множестве A значение tmu = minj {ti} и множество B \subseteq  A номеров работ, назначенных на процессоры и закончивших выполнение к моменту t_{\mu }. Полагаем равными нулю все позиции A, составляющие B. Этим имитируется окончание выполнения работ на процессорах к моменту времени t_{\mu }.
  3. Для всех процессоров, для которых текущее время занятости меньше значения t_{\mu } (T_{i} < t_{\mu }), записываем простой в течение времени t_{\mu } - T_{i} (символом простоя \ubox{t_{\mu} - T_i} ). Для этих процессоров полагаем T_{i} =t_{\mu }.
  4. Исключаем из S_{\nu } строки и столбцы, соответствующие всем работам из B, после чего матрицу S_{\nu }  (S^{*}_{\nu }) уплотним. Полагаем \nu := \nu  + 1. Таким образом сформируется матрица S_{\nu } (а также S^{*}_{\nu } ) на новом шаге распределения.
  5. Находим множество R — входов матрицы следования S_{\nu }, соответствующих не назначенным ранее работам. Если R \ne  \varnothing, переходим к выполнению 6, в противном случае выполняем пункт 2.
  6. Пусть для определенности R = \{ \alpha _{1} \dots  \alpha _{r}\}, работе \alpha _{p} соответствует вес {tp1 ... tpN}, p = 1 ... r. Формируем суммы Tl + tpl , l = 1 ... N, p = 1 ... r. Для каждого значения p (т.е. для каждой работы из R ) находим минимальную (по l ) из таких сумм, т.е. для каждой работы находим один или несколько процессоров, на которых время окончания выполнения этой работы минимально при текущих значениях занятости процессоров. Найденные суммы сведем в невозрастающую последовательность R*, состоящую из r чисел. При этом сохраним информацию о соответствии процессорам.
  7. Ставим в соответствие каждой p -й работе, представленной в последовательности R*, значение \sigma _{p}, равное числу процессоров, при выполнении на которых достигается найденное минимальное время окончания выполнения этой работы.
  8. Производим последовательное назначение работ на процессоры следующим образом. Назначаем не более N работ слева направо в соответствии с вхождением времени окончания их выполнения в последовательность R*. Каждую p -ю работу назначаем на все те процессоры, (их число равно \sigma _{p} ), на которых достигается входящее в R* время окончания выполнения. В результате те работы, для которых \sigma  > 1, окажутся назначенными более чем на один процессор, а на один процессор на данном шаге могут оказаться назначенными более одной работы. Чтобы определить окончательно, на какой процессор должна быть назначена p -я работа, воспользуемся следующей процедурой. Для каждого процессора проводим анализ, сколько работ назначено на него на данном шаге распределения. Если назначения не произошло, переходим к анализу назначения на следующий процессор или заканчиваем анализ процессоров, если все они просмотрены. Если оказалась назначенной на процессор одна, p -я, работа, считаем ее окончательно закрепленной за данным процессором, и, если \sigma _{p} > 1, исключаем ее из рассмотрения при анализе последующих процессоров — т.е., снимаем ее с назначения на другие процессоры. Если на процессор назначено более одной работы, закрепляем за процессором лишь ту работу \alpha _{p}, которая имеет минимальное значение \sigma _{p}. Если несколько работ имеют равное минимальное значение \sigma _{p}, назначаем любую (первую) из них. Для множества работ \{ \gamma \}, отклоненных от назначения на данный процессор, полагаем \sigma _{\gamma } := \sigma _{\gamma }- 1. Значение \sigma _{\gamma } = 0 означает, что работе \gamma отказано в назначении на данном шаге распределения. Назначенную работу исключаем из рассмотрения при анализе следующих процессоров. Номера назначенных работ оказываются записанными в строки таблицы \tau, соответствующие процессорам. Эти номера исключаем из R. Номер каждой назначенной работы и время окончания ее выполнения (оно же — время занятости процессора) заносим в A.
  9. Проверяем, все ли работы распределены. При отрицательном результате проверки переходим к выполнению 2.

    Конец алгоритма.

Пример.

При k = 2, n1 = 1, n2 = 2, (N = 3) распределим работы, отображенные расширенной матрицей следования на рис. 10.16 (соответствующей графу на рис. 10.15), для минимизации времени выполнения.

Преобразование расширенной матрицы следования

Рис. 10.16. Преобразование расширенной матрицы следования

  1. T_{1} = T_{2} = T_{3} = 0,  A = B = \varnothing    ,  S_{1} = S, R =\{ 1\}. Выполнение работы 1 ранее всех закончит процессор 1. После ее назначения T_{1} = 1, T_{2} = T_{3} = 0,A =  \{ 1 \leftrightarrow  1\}.
  2. Найдем в A работу 1 с минимальным временем окончания выполнения, равным 1. Записываем простои в одну единицу времени процессорам 2 и 3. Таблица \tau принимает вид
    \begin{array}{l|l@{\qquad}|l}
1 & 1 & T_1=1\\
\hline
2 & \ubox{1} & T_2=1\\
\hline
3 & \ubox1 & T_3=1
\end{array}
  3. После исключения первой строки и первого столбца из S1 (т.е. по матрице S2 ) найдем R = {2, 3, 4, 6}. Составим таблицу 10.1 времени окончания выполнения каждой работы из R каждым процессором l = 1, 2, 3. Минимальное время окончания выполнения каждой работы выделено.

    Таблица 10.1.
    l Tl+t2l Tl+t3l Tl+t4l Tl+t6l
    1 4 3 6 4
    2 3 6 6 2
    3 3 6 6 2

    Формируем последовательность R^{*} =  \{ 6 (4; 1, 2, 3, \sigma _{4} = 3), 3(2; 2,3, \sigma _{2} = 2), 3( 3; 1, \sigma _{3} = 1),  2 (6; 2,3,\sigma _{6} = 2)\}, где в круглых скобках указаны номер работы, список процессоров, на которых достигается минимальное время окончания ее выполнения, и число \sigma _{p} этих процессоров.

    Назначим первоначально (таблица 10.2) работу 4 на процессоры 1, 2, 3, работу 2 — на процессоры 2 и 3 , работу 3 — на процессор 1.

    Таблица 10.2.
    1 4 ( \sigma 4 = 3), 3( \sigma 3 = 1)
    2 4 ( \sigma 4 = 3), 2( \sigma 2 = 2)
    3 4 ( \sigma 4 = 3), 2( \sigma 2 = 2)

    После анализа значений \sigma _{p} оставим на процессоре 1 работу 3 (после чего \sigma _{4} = 2 ), на процессоре 2 — работу 4 (после чего \sigma _{2} = 1 ), на процессоре 3 — работу 2, A = \setminus \{ 3 \leftrightarrow  3, 4 \leftrightarrow  6, 2\leftrightarrow  3\setminus \}. Таблица распределения \tau примет вид

    \begin{array}{c|c|c}
1 & 1,   3     & T_1 = 3\\
\hline
2 & \ubox 1, 4 & T_2 = 6\\
\hline
3 & \ubox 1, 2 & T_3 = 3
\end{array}

  4. B = {2, 3}. После исключения строк и столбцов, соответствующих работам 2 и 3, из матрицы S2, т.е. по сформированной матрице S3, найдем R = {5, 6}. Составим таблица 10.3 значений времени окончания выполнения каждой работы из R каждым процессором.

    Таблица 10.3.
    l Tl+t5l Tl+t6l
    1 5 6
    2 10 7
    3 7 4

    Из таблицы найдем R^{*} = \{ 5 (5; 1, \sigma _{5} = 1), 4 (6; 3, \sigma _{6} =1)\},

    Назначим работу 5 на процессор 1, работу 6 — на процессор 3, A =\{ 5 \leftrightarrow  5,4 \leftrightarrow  6, 6 \leftrightarrow  4\}. Таблица распределения \tau примет вид

    \begin{array}{c|c|c}
1  &  1,   3,   5   & T_1 = 5\\
\hline
2  & \ubox1,   4  & T_2 = 6\\
\hline
3  & \ubox 1,   2,   6   & T_3 = 4
\end{array}

  5. B = {6}. После исключения строки и столбца, соответствующих работе 6, из матрицы следования S3, т.е. по сформированной матрице S4, найдем R = \varnothing. Назначим процессору 3 простой в течение одной условной единицы времени. Таблица \tau примет вид

    \begin{array}{c|c|c}
1 & 1, 3, 5,  & T_1> = 5\\
\hline
2 & \ubox 1, 4  & T_2 = 6\\
\hline
3 & \ubox 1, 2, 6, \ubox1   & T_3 = 5
\end{array}

  6. B = {5}. После преобразования матрицы S4, т.е. по матрице S5, найдем R = {7, 8}. Из таблицы 10.4, аналогичной таблице 3, найдем R^{*} = \{ 9 (8;1, \sigma _{8} = 1),  7 (7; 3, \sigma _{7} = 1)\} .

    Таблица 10.4.
    l Tl+t7l Tl+t8l
    1 9 9
    2 8 11
    3 7 10

    Назначаем работу 8 на процессор 1, работу 7 — на процессор 3. Таблица \tau примет вид

    \begin{array}{c|c|c}
1  & 1, 3, 5,  8    & T_1 = 9\\
\hline
2  & \ubox 1, 4    & T_2 = 6\\
\hline
3  & \ubox 1, 2, 6, \ubox 1, 7  & T_3 = 7
\end{array}

  7. B = {4}. После исключения строки и столбца, соответствующих работе 4, из матрицы следования S5, т.е. по сформированной при этом матрице S6, найдем R = {9}. Время окончания выполнения работы 9 на процессорах равно соответственно 10, 8, 9. Назначаем работу 9 на процессор 2. Таблица \tau примет окончательный вид

    \begin{array}{c|c|c}
1 & 1, 3, 5,  8  & T_1 = 9\\
\hline
2 & \ubox1, 4, 9      & T_2 = 8\\
\hline
3 & \ubox 1, 2, 6, \ubox 1, 7 & T_3 = 7.
\end{array}

Дополнение.

Данный диспетчер для неоднородной ВС построен на основе обобщения рассмотренного диспетчера последовательного назначения для однородных ВС, который можно рассматривать как частный случай при k = 1.

Он применим и в другом частном случае: когда отсутствует частичная упорядоченность работ, то есть когда надо разделить "поровну" взаимно независимые работы между n исполнителями. Наглядный пример такого распределения составляет задача о рюкзаках, рассмотренная в разделе 10.1.1.

< Лекция 9 || Лекция 10: 1234 || Лекция 11 >