Опубликован: 25.10.2007 | Доступ: свободный | Студентов: 1276 / 290 | Оценка: 4.40 / 4.36 | Длительность: 21:57:00
Специальности: Математик
Дополнительный материал 1:

Приложение. Параллельные вычисления на кластерах из персональных компьютеров в математической физике (В.Е.Карпов, А.И.Лобанов)

< Лекция 9 || Дополнительный материал 1: 12345

4. Модели организации параллельных вычислений для комплексов с распределенной памятью

Эффективность работы параллельных программ на вычислительных комплексах с распределенной памятью определяется тремя составляющими:

  • степенью внутреннего параллелизма алгоритма;
  • количеством данных, передаваемых между процессорами;
  • степенью равномерности загрузки процессоров.

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

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

Пусть задан следующий фрагмент программного кода:

do k = 1, maxiter
        do i = 1, n
            a(i) = f(a(i),b(i))
        enddo
    enddo
    print *,a

Для внутреннего цикла массивы a и b являются входными (они требуются для вычислений на любом процессоре). Массив a относится и к выходным, так как "полный" массив требуется, по крайней мере, на одном процессоре после завершения параллельных вычислений.

Потоковая модель представляет собой модель вычислений по классической схеме master-worker и требует наличия двух программ с различными кодами. Все вычисления, за исключением параллельных частей алгоритма, выполняются только на главном процессоре ( master ). Параллельные части выполняются на рабочих процессорах ( workers ). Для приведенного выше фрагмента кода организация вычислений в потоковой модели выглядит следующим образом:

master (фрагмент программы 1)
    do k = 1, maxiter

(балансировка загрузки рабочих процессов и передача им соответствующих частей ранее вычисленных массивов a и b )

(сбор вычисленных частей массива a от рабочих процессоров для последующего использования)

enddo
    print *,a
    worker (фрагмент программы 2)
    (прием своей части массивов a и b и границ цикла)
    do i = imin, imax
        a(i) = f(a(i),b(i))
    enddo

(отправка вычисленной части массива a главному процессору)

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

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

do k = 1, maxiter
        (балансировка загрузки процессов)
    do i = imin, imax
        a(i) = f(a(i),b(i))
    enddo

(рассылка вычисленной части массива a на все другие процессоры и 
    сбор информации от них) 

    enddo
    print *,a (возможно, только на главном процессоре)

В динамической модели входные данные никогда не передаются между процессорами. Вместо этого производится широковещательная рассылка выходных данных по окончании параллельного яруса. Сравнительная эффективность моделей организации вычислений определяется количеством входных и выходных данных для каждой параллельной части программы. Обе модели (и потоковая, и динамическая ) могут применять динамическую балансировку загрузки процессоров непосредственно перед выполнением параллельного яруса.

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

do k = 1, maxiter
        do i = imin, imax
            a(i) = f(a(i),b(i))
        enddo
    enddo
(рассылка и сбор вычисленной части массива a)
print *,a (возможно, только на одном процессоре)

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

< Лекция 9 || Дополнительный материал 1: 12345