Красавин Компютерныы практикум в среде МатЛаб 2015
.pdf
Задания
22.1. Используя приведенный код для дракона Хартера– Хейтуэя, реализовать построение следующих фигур (рис. 22.2):
а) кривая Гильберта: |
|
|
|||
Аксиома: |
|
|
|
|
|
Порождающие правила: |
|
||||
New |
– |
|
– |
|
|
New |
– |
|
|||
New |
|
– |
|
||
α |
0; θ |
|
π/2 |
|
|
б) кривая Госпера: |
|
|
|||
Аксиома: |
|
|
|
|
|
Порождающие правила: |
|
||||
New |
|
|
– – – |
– |
|
New |
– |
|
|||
New |
π/3 |
–– |
– |
||
α |
0; θ |
|
|
|
|
в) кривая Серпинского:
Аксиома: Порождающие правила:
New
New – – – –
New
π
α 4; θ π/2
г) остров: Аксиома:
Порождающие правила:
New – – –
New
New
α 0; θ π/2
251
д) орнамент: Аксиома:
Порождающие правила:
New
New
New
α 0; θ π/2
а |
б |
в |
г |
д
Рис. 22.2. Изображения кривых из задания 22.1
252
Изображения этих кривых приведены на рис. 22.2, где а – кривая Гильберта 5-го порядка; б – кривая Госпера 4-го порядка; в – кривая Серпинского 4-го порядка; г – кривая «остров» 3-го порядка; д – кривая «орнамент» 4-го порядка.
22.2. Модифицировать приведенный код для дракона Хартера– Хейтуэя так, чтобы было возможно учитывать команду , т.е. продвижение вперед без прорисовки следа. При помощи нового алгоритма построить следующие фигуры:
а) мозаика: |
– – |
– |
|
|
Аксиома: |
– |
|||
|
|
|||
Порождающие правила: |
||||
New |
– |
– – – – |
||
New α 0
θπ/2
б) ковер:
Аксиома: Порождающие правила:
New – – – –
New α 0
θπ/2
22.3. Модифицировать приведенный код для дракона Хартера– Хейтуэя так, чтобы было возможно учитывать команды ветвления [ и ]. Если в L-системе встречается символ [ – открыть ветвь, то текущие координаты черепахи и угол, под которым она смотрит,
, , , необходимо запомнить, сохранив в отдельную переменную. К этим переменным нужно вернуться, если в L-
253
системе встретится символ ] – закрыть ветвь. При помощи нового
алгоритма построить следующие фигуры:
а) цветок: |
|
– |
– – |
|
Аксиома: |
|
|||
Порождающие правила–: |
||||
New |
|
– |
– – |
|
α |
π/2 |
|
|
|
θ |
π/2 |
|
|
|
б) куст: |
|
|
|
|
Аксиома: |
|
– – – |
– |
|
Порождающие правила: |
||||
New |
– |
|||
α |
0 |
|
|
|
θ |
π/8 |
|
|
|
254
23
Параллельные вычисления
23.1. Математическая основа параллельных вычислений
Многие задачи требуют вычислений с большим количеством операций, которые занимают значительные ресурсы даже на современной технике, более того, можно с уверенностью считать, что каких бы скоростей ни достигла вычислительная техника, всегда найдутся задачи, на решение которых потребовалось бы значительное время. Многие из таких сложных задач требуют, чтобы результат был получен за как можно меньшее время, или даже строго ограниченное. Такие современные проблемы науки и техники, как моделирование климата, генная инженерия, проектирование интегральных схем, анализ загрязнения окружающей среды, создание лекарственных препаратов и др., требуют для своего анализа ЭВМ с производительностью более 1000 млрд операций с плавающей запятой в секунду (1 терафлоп). С другой стороны, представляет большую техническую проблему уменьшение времени исполнения каждой операции в микропроцессоре. Очевидным способом увеличить скорость вычислений было бы применение не одного вычислительного устройства, а нескольких, работающих совместно над решением одной задачи. Такой подход носит название параллельных вычислений. Несмотря на кажущуюся простоту решения, оно является подчас весьма нетривиальной задачей по проектированию вычислительной техники и разработке алгоритмов. Первая проблема кроется в том, что для того, чтобы задачу можно было решить с помощью параллельных вычислений, алгоритм ее решения должен допускать распараллеливание, мало того, далеко не каждая задача может быть решена параллельным алгоритмом. Другой же, не менее важной проблемой, является построение
255
системы, на которой бы возможна была реализация параллельных вычислений.
Параллельные вычисления могут ускорить оптимизационный процесс при условии, что вычисления требуют намного больше времени, чем отправка, получение и обработка данных. Однако эффективное планирование операций и контроль системы – комплексная трудноразрешимая задача.
Традиционно программа писалась как последовательность вычислений. Она выполнялась на одном компьютере, имеющем один центральный процессор. Инструкции программы выполнялись одна за другой. Некоторые из сегодняшних программ пытаются использовать мультипроцессоры для вычислений. Программа разбивается на части, которые могут быть решены одновременно. Эти части вычисляются на различных процессорах. Вычислительные ресурсы могут содержать либо компьютер с мультипроцессором; либо несколько компьютеров, соединенных по сети; либо и то, и другое.
В условиях перехода производителей процессоров к многоядерным архитектурам параллельное программирование становится насущным инструментом каждого продвинутого программиста и исследователя. Стандартом де-факто параллельного программирования является интерфейс передачи сообщений (MPI), но освоить его удается не всем. Поэтому создатели пакетов программ, среди которых и MatLab, озаботились внедрением параллельных и распределенных вычислений в свои пакеты.
Параллельные вычисления возможны тогда, когда отсутствует необходимость в завершении предыдущей операции для начала следующей. В качестве примера можно взять следующее выражение:
5·7 3·13.
256
Для того чтобы произвести второе умножение, не требуется знать результата первого, следовательно, оба умножения можно произвести параллельно, и только после этого произвести сложение. Очевидно, не каждое вычисление можно распараллелить. Выражение
5·7·3 13
можно вычислить только последовательно, сначала первое умножение, затем второе, и только после этого – сложение.
23.2. Parallel Computing Toolbox
Parallel Computing Toolbox позволяет решать значительные по объему данных и вычислений задачи, используя MatLab и Simulink на мультиядерных и мультипроцессорных компьютерах. Такие конструкции параллельной обработки, как параллельные циклы for, распределенные массивы, параллельные числовые алгоритмы и функции передачи сообщений, позволяют осуществлять параллельные алгоритмы в MatLab на высоком уровне, без программирования для специальных аппаратных средств и сетевых архитектур. В результате преобразование последовательных приложений MatLab в параллельные требует незначительных изменений кода и не требует программирования на языке нижнего уровня вообще. Приложения запускаются в интерактивном режиме или офлайн, в пакетных средах.
23.3. Параллельный цикл for
Многие приложения содержат повторяющиеся сегменты кода. Часто для решения задачи в таких случаях используется цикл for. Возможность параллельно выполнить код на отдельном компьютере или на кластере может значительно улучшить производительность в следующих случаях.
257
1. Программы с независимыми сегментами, выполняющие ряд несвязанных задач, можно выполнять одновременно на отдельных ресурсах. Цикл for обычно не применяется для таких отчетливо различных задач, однако параллельный цикл for может стать подходящим решением.
2. Выполняются приложения, включающие перемещение параметров, т.е. в приложение загружаются какие-либо начальные данные, не изменяющиеся в процессе, а на выходе собираются результирующие данные. При большом числе итераций перемещение параметров может занимать много времени: каждая итерация может выполняться довольно быстро, но на выполнение тысяч или миллионов таких итераций уйдет много времени. С другой стороны, процесс может и не содержать большого числа итерации , однако каждая из них может выполняться длительное время. Как правило, единственное различие между итерациями определено различными входными данными. В этих случаях способность выполнить отдельные итерации одновременно может значительно улучшить производительность. Выполнение таких итераций параллельно является идеальным способом обработки больших или множественных наборов данных. Единственное ограничение заключается в том, что итерации не могут зависеть друг от друга.
Parallel Computing Toolbox улучшает производительность выполнения таких циклов, позволяя нескольким системным процессам (в среде MatLab они называются workers) выполнять отдельные итерации цикла одновременно. Например, цикл из 100 итераций можно запустить на кластере из 20 workers так, чтобы одновременно каждый системный процесс выполнял пять итераций. Конечно, скорость работы не улучшится в 20 раз из-за сетевого трафика, однако ускорение будет существенным. Даже запуск локальных системных процессов на одной машине показывает существенное улучшение производительности на многоядерном компьютере. Итак, независимо от того, занимает ли цикл много времени из-за числа итераций, или из-за их размеров,
258
скорость работы можно увеличить, распределяя итерации между workers MatLab.
Пример 23.1 показывает, как изменить простой цикл for, чтобы он выполнялся параллельно. Этот пример демонстрирует технические различия, и существенных улучшений с точки зрения быстродействия не видно.
Пример 23.1. Пусть есть цикл для вычисления значений синуса и его графического отображения:
for i=1:1024
A(i) = sin(i*2*pi/1024);
end plot(A)
Чтобы в интерактивном режиме выполнить код, содержащий параллельный цикл, необходимо сначала открыть пул MatLab. Это зарезервирует несколько рабочих сессий для выполнения итераций цикла (рис. 23.1).
parpool
После этого изменяем исходный код для его параллельного выполнения.
parfor i=1:1024
A(i) = sin(i*2*pi/1024);
end plot(A)
Рис. 23.1. Параллелизация циклаfor
259
Единственное различие в этом цикле – ключевое слово parfor вместо for. После того, как цикл выполнится, результаты выглядят так же, как и сгенерированные в предыдущем цикле.
Поскольку итерации работают параллельно во всех сеансах MatLab, каждая итерация должна быть полностью независимой от всех других итераций. Системный процесс, вычисляющий значение для A(100), не обязательно будет системным процессом, вычисляющим A(500). Также нет никакой гарантии того, что значение A(900) будет вычислено позже A(400). Значения всех элементов массива A будут доступны в клиентской сессии MatLab только после того, как все данные возвращаются от workers MatLab, и цикл завершается.
После завершения вычислений закрываем пул:
delete(gcp)
23.4. spmd
Для многоуровневого контроля параллельных схем Parallel Computing Toolbox предоставляет такие конструкции, как spmd (парадигма «одна программа – много данных»), и ряд процедур передачи сообщений, основанных на стандартной библиотеке MPI. Конструкция spmd позволяет выделять секции кода, которые будут запущены одновременно на workers, участвующих в параллельных вычислениях. Во время исполнения программы spmd автоматически передаeт данные и код внутри этой секции системным процессам и, как только исполнение завершится, забирает результаты в клиентскую сессию MatLab.
23.5. Параллельные вычисления с pmode
С помощью режима pmode непосредственно из командного окна MatLab становится возможным обращение к workers, просмотр их локальных переменных, обмен данными между ними. В режиме pmode команды, вводимые в рабочем окне MatLab, будут исполняться всеми рабочими процессами. Режим pmode
260
