Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка третья по MATLAB

.pdf
Скачиваний:
181
Добавлен:
19.03.2015
Размер:
1.28 Mб
Скачать

2.2 Parallel Computing Toolbox™

Parallel Computing Toolbox позволяет решать значительные по объему данных и вычислений задачи, используя MATLAB® и Simulink® на мультиядерных и мультипроцессорных компьютерах. Конструкции параллельной обработки, такие как параллельные циклы for, распределенные массивы, параллельные числовые алгоритмы, и функции передачи сообщений позволяют осуществлять параллельные алгоритмы в MATLAB на высоком уровне, без программирования для специальных аппаратных средств и сетевых архитектур. В результате преобразование последовательных приложений MATLAB в параллельные требует незначительных изменений кода и не требует программирование на языке нижнего уровня вообще. Приложения запускаются в интерактивном режиме или офлайн, в пакетных средах.

Главные свойства

Поддержка разработки параллельных приложений.

Способность аннотировать сегменты кода при помощи функций parfor (параллельны для циклов), и spmd (множественные данные отдельной программы) для осуществления параллельных алгоритмов.

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

Возможность запустить до 8 рабочих на многоядерном компьютере

Интеграция с MATLAB Distributed Computing Server для приложений,

использующих большее число рабочих

Интерактивные и пакетные режимы выполнения

11

Рисунок 1. Разработка параллельных приложений с Parallel Computing Toolbox.

Этот Toolbox позволяет приложению работать с восемью локальными рабочими (слева) и с MATLAB Distributed Computing Server (справа).

Parallel Computing Toolbox можно использовать для запуска приложения на отдельном многоядерном либо многопроцессорном компьютере. Не изменяя код, то же самое приложение может быть запущено на кластере.

Рисунок 2. Диаграмма улучшения на 4­х ядерном процессоре, массив

3000х3000

12

2.3 Разработка параллельных приложений в MATLAB

Параллельный цикл

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

1)Приложения, включающие перемещение параметров

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

Длинные итерации – Перемещение может и не содержать большого

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

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

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

Parallel Computing Toolbox улучшает производительность выполнения таких циклов, позволяя нескольким рабочим выполнять отдельные итерации цикла одновременно. Например, цикл из 100 итераций можно запустить на кластере из 20 рабочих так, чтобы одновременно каждый рабочий выполнял пять итераций. Конечно, скорость работы не улучшится в 20 раз из­за сетевого

13

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

MATLAB.

Пример параллельного цикла for

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

1.Пусть наш цикл содержит цикл для вычисления значений синусу и графического его отображения.

for i=1:1024

A(i) = sin(i*2*pi/1024); end

plot(A)

2.Чтобы в интерактивном режиме выполнить код, содержащий параллельный цикл, необходимо сначала открыть пул MATLAB. Это зарезервирует несколько рабочих сессий для выполнения итераций цикла. Он может содержать локальных рабочих, либо запущенных на кластере:

matlabpool open local 3

3.После этого изменяем исходный код, для его параллельного выполнения:

parfor i=1:1024

A(i) = sin(i*2*pi/1024); end

plot(A)

14

Единственное различие в этом цикле ­ ключевое слово parfor вместо for. После того, как цикл выполняется, результаты выглядят так же, как и сгенерированные в предыдущем цикле.

Рисунок 3. Параллелизация цикла for

Поскольку итерации работают параллельно во всех сеансах MATLAB, каждая итерация должна быть полностью независимой от всех других итераций. Рабочий, вычисляющий значение для A(100), может не быть рабочим, вычисляющим A(500). Нет никакой гарантии последовательности такой, чтобы A(900) вычислялся раньше, чем A(400). Значения всех элементов массива A доступны в клиентской сессии MATLAB, после того, как все данные возвращаются от рабочих MATLAB и цикл завершается.

4. После завершения вычислений закрываем пул.

matlabpool close

15

2.4 Цикл parfor

Фундаментальное понятие parfor­цикла в MATLAB такое же, как и у стандартного цикла for: MATLAB выполняет ряд операций (тело цикла) в диапазоне значений. Часть тела цикла parfor выполняется на клиенте MATLAB (где parfor запущен), и часть выполняется параллельно на рабочих MATLAB. Необходимые данные, которые обрабатывает parfor, отправляются от клиента рабочим, где и происходит большая часть вычислений, затем результаты отсылаются назад клиенту и объединяются.

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

Каждое выполнение тела parfor­цикла ­ итерация. Рабочие MATLAB выполняют итерации беспорядочно и независимо друг от друга. Поскольку все итерации независимы, нет никакой гарантии синхронизированности итераций, так же как и нет потребности в этом. Если число рабочих равно числу итераций цикла, каждый рабочий выполняет одну итерацию. Если итераций больше, чем рабочих, некоторые рабочие выполняют более одной итерации; в этом случае, рабочий может получить несколько итерации сразу, чтобы уменьшить время коммуникации.

Когда использовать parfor?

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

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

16

этот цикл не целесообразно использовать для небольшого количества простых вычислений.

Создание цикла parfor

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

Этот пример показывает эквивалентные последовательный (слева) и параллельный (справа) циклы.

clear A

 

clear A

for i =

1:8

parfor i = 1:8

A(i)

= i;

A(i) = i;

end

 

end

A

 

A

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

Различия между циклами for и parfor

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

clear A

clear A

d = 0; i = 0;

d = 0; i = 0;

for i = 1:4

parfor i = 1:4

d = i*2;

d = i*2;

A(i) = d;

A(i) = d;

end

end

A

A

d

d

i

i

Хотя элементы массива А будут одинаковыми в обоих случаях, значения переменной d будут различными. В цикле слева итерации выполняются последовательно, таким образом, d будет иметь значение, принятое в последней итерации цикла. В parfor­цикле справа, итерации

17

выполняются параллельно, а не последовательности, таким образом невозможно определить значение d до завершения цикла. Это также относится к переменной цикла, i. Поэтому, поведение цикла parfor определяется так, что оно не затронуло значения d и i вне цикла вообще. Их значения остаются неизменными до и после цикла. Итак, цикл parfor требует, чтобы весь код, который следует за циклом не, зависел от последовательности итераций цикла. Результат выполнения:

A =

 

 

 

A =

 

 

 

2

4

6

8

2

4

6

8

d =

 

 

 

d =

 

 

 

8

 

 

 

0

 

 

 

i =

 

 

 

i =

 

 

 

4

 

 

 

0

 

 

 

Рассмотрим следующий пример:

Попытаемся посчитать последовательность Фибоначчи

f = zeros(1,50); f(1) = 1;

f(2) = 2; parfor n = 3:50

f(n) = f(n­1) + f(n­2);

end

Этот цикл написан некорректно, поскольку значение f в каждой итерации зависит от результата выполнения других итераций.

18

2.5Параллельные вычисления с pmode

Спомощью этого режима непосредственно из командного окна MATLAB становится возможным обращение к процессам рабочих, просмотр их локальных переменных, обмен данными между ними. В режиме pmode команды, вводимые в рабочем окне MATLAB, будут исполняться всеми рабочими процессами. Режим pmode чаще всего используется как средство отладки параллельных программ.

Принцип работы

Pmode позволяет интерактивно выполнять параллельное задание, выполняемое одновременно на нескольких лабораториях. Команды, набираемые в Parallel Command Window, выполняются на всех лабораториях. Каждая лаборатория выполняет команды в собственном рабочем пространстве и с собственными переменными.

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

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

Запуск pmode

Этот пример использует местного планировщика и запускает лаборатории на локальной машине. Такой запуск не требует внешнего

19

кластера или планировщика. Шаги включают подсказку pmode (P>>) для команд, набираемых в Parallel Command Window.

1. Запустим pmode с помощью команды pmode.

pmode start local 2

Это запустит две местные лаборатории, создает параллельное задание для работы с ними, и открывает Parallel Command Window.

Рисунок 4. Запуск Parallel Command Window

Для иллюстрации того, что команды в pmode выполняются на всех лабораториях, наберем следующее:

P>> help magic

Введем переменную в pmode:

P>> x = pi

20