|
Система автоматизации распараллеливания. Отображение на SMP-кластер
Система автоматизации распараллеливания. Отображение на SMP-кластер
- Оглавление
- 1. Аннотация
- 2. Введение
- 2.1 Развитие вычислительной техники. SMP-кластеры.
- 2.2 Параллельное программирование
- 2.3 Модель параллелизма DVM/OpenMP
- 2.3.1 Преимущества DVM/OpenMP
- 2.4 Актуальность работы
- 3. Постановка задачи
- 3.1 Структура "Системы автоматизации распараллеливания"
- 3.2 Цель работы "DVM/OpenMP-эксперт"
- 4. Предыдущие решения "систем автоматизации распараллеливания на SMP-кластер"
- 5. Исследование и построение решения задачи
- 5.1 Автоматическое распараллеливание программ на DVM и DVM/OpenMP
- 5.2 Структура DVM-эксперта
- 5.3 Структура DVM/OpenMP-эксперта
- 5.3.1 Варианты распараллеливания на OpenMP
- 6. Практическая реализация
- 6.1 Список используемых терминов
- 6.2 Блок поиска DVM/OpenMP-вариантов
- 6.2.1 Краткий алгоритм работы
- 6.2.2 Входные данные
- 6.2.3 Детальный алгоритм работы
- 6.2.4 Оценочная функция варианта распараллеливания гнезда циклов на DVM/OpenMP.
- 6.2.4.1 Оценка времени выполнения цикла, не распараллеленного на OpenMP.
- 6.2.4.2 Оценка времени выполнения параллельного цикла без конвейера
- 6.2.4.3 Оценка времени выполнения параллельного цикла с конвейером
- 6.2.4.4 Оценка времени выполнения гнезда циклов
- 6.3 Блок поиска наилучшего DVM/OpenMP-варианта
- 6.3.1 Характеристики эффективности параллельной программы
- 6.3.2 Алгоритм пересчета характеристик эффективности
- 6.4 Особенности реализации
- 6.4.1 Классы решаемых задач
- 6.4.2 Специальные комментарии.
- 6.4.3 Аргументы командной строки
- 6.5 Результаты тестирования
- 7. Заключение
- 8. Список цитируемой литературы
- Приложение А. Графики времен выполнения и ускорений распараллеленных тестовых программ
1. АннотацияЦелью данной работы являлась разработка алгоритма преобразования последовательной программы на языке Fortran в параллельную программу на языке Fortran-DVM/OpenMP. Это преобразование осуществляет блок ("DVM/OpenMP-эксперт") экспериментальной системы автоматизации распараллеливания, используя результаты анализа информационной структуры последовательной программы.К моменту начала работы над поставленной задачей система автоматизации распараллеливания содержала блок, именуемый "DVM-экспертом", который автоматизирует распараллеливание Fortran-программы на кластер. В рамках дипломной работы DVM-эксперт был доработан до DVM/OpenMP-эксперта, автоматизирующего распараллеливание Fortran-программ на SMP-кластер.Разработанные алгоритмы были реализованы, включены в состав экспериментальной системы и проверены при распараллеливании тестовых примеров.1. Введение1.1 Развитие вычислительной техники. SMP-кластерыВычислительная техника в своем развитии по пути повышения быстродействия ЭВМ приблизилась к физическим пределам. Время переключения электронных схем достигло долей наносекунды, а скорость распространения сигналов в линиях, связывающих элементы и узлы машины, ограничена значением 30 см/нс (скоростью света). Поэтому дальнейшее уменьшение времени переключения электронных схем не позволит существенно повысить производительность ЭВМ. В этих условиях требования практики (сложные физико-технические расчеты, многомерные экономико-математические модели и другие задачи) по дальнейшему повышению быстродействия ЭВМ могут быть удовлетворены только путем распространения принципа параллелизма на сами устройства обработки информации и создания многомашинных и многопроцессорных (мультипроцессорных) вычислительных систем. Такие системы позволяют распараллелить выполнение программы или одновременно выполнять несколько программ.Последние годы во всем мире происходит бурное внедрение вычислительных кластеров. Вычислительный кластер - это мультикомпьютер, состоящий из множества отдельных компьютеров (узлов), связанных между собой единой коммуникационной системой. Каждый узел имеет свою локальную оперативную память. При этом общей физической оперативной памяти для узлов не существует. Если в качестве узлов используются мультипроцессоры (мультипроцессорные компьютеры с общей памятью), то такой кластер называется SMP-кластером.Привлекательной чертой кластерных технологий является то, что они позволяют для достижения необходимой производительности объединять в единые вычислительные системы компьютеры самого разного типа, начиная от персональных компьютеров и заканчивая мощными суперкомпьютерами. Таким образом, кластеры являются легко-масштабируемыми. Широкое распространение кластерные технологии получили как средство создания систем суперкомпьютерного класса из составных частей массового производства, что значительно удешевляет стоимость вычислительной системы.В то же самое время, для повышения производительности кластера, в качестве узлов нередко используются мультипроцессоры. Таким образом, теперь программист имеет дело с двумя уровнями параллелизма - параллельное выполнение задач на узлах кластера, и параллельное выполнение подзадач на ядрах мультипроцессора.1.2 Параллельное программированиеВ настоящее время практически все параллельные программы для кластеров разрабатываются с использованием низкоуровневых средств передачи сообщений (MPI). Однако MPI-программы имеют ряд существенных недостатков:· низкий уровень программирования и как следствие, высокая трудоемкость разработки программ;· сложность выражения многоуровневого параллелизма программы;· MPI-программы, как правило, неспособны эффективно выполняться на кластерах, у которых процессоры имеют разную производительность.В то же время, на текущий момент так и нет и общепризнанного высокоуровневого языка параллельного программирования, позволяющего эффективно использовать возможности современных ЭВМ.Таким образом, разработка программ для высокопроизводительных кластеров, и в особенности SMP-кластеров, продолжает оставаться исключительно сложным делом, доступным узкому кругу специалистов и крайне трудоемким даже для них.Попытки разработать автоматически распараллеливающие компиляторы для параллельных ЭВМ с распределенной памятью, проведенные в 90-х годах (например, Paradigm, APC), привели к пониманию того, что полностью автоматическое распараллеливание для таких ЭВМ реальных производственных программ возможно только в очень редких случаях. В результате, исследования в области автоматического распараллеливания для параллельных ЭВМ с распределенной памятью практически были прекращены.Исследователи сосредоточились на двух направлениях:o разработка высокоуровневых языков параллельного программирования (HPF, OpenMP-языки, DVM-языки, CoArray Fortran, UPC, Titanium, Chapel, X10, Fortress);o создание систем автоматизированного распараллеливания (CAPTools/Parawise, FORGE Magic/DM, BERT77), в которых программист активно вовлечен в процесс распараллеливания. [3]Остановим свое внимание на высокоуровневом языке параллельного программирования DVM/OpenMP.1.3 Модель параллелизма DVM/OpenMPВ последнее время для вычислительных систем, сочетающих в себе одновременно характеристики архитектур, как с общей, так и с распределенной памятью, используется так называемая "гибридная" модель. При этом программа представляет собой систему взаимодействующих процессов, а каждый процесс программируется на OpenMP. Рассмотрим вычислительную сеть, каждый узел которой является мультипроцессором или отдельным процессором:На первом этапе определяются массивы, которые могут быть распределены между узлами (распределенные данные). Эти массивы специфицируются DVM-директивами отображения данных. Остальные переменные (распределяемые по умолчанию) отображаются по одному экземпляру на каждый узел (размноженные данные). Распределение данных определяет множество локальных или собственных переменных для каждого узла. Распределив по узлам данные, пользователь должен обеспечить и распределение вычислений по узлам. При этом должно выполняться правило собственных вычислений: на каждом узле выполняются только те операторы присваивания, которые изменяют значения переменных, размещенных на данном узле. В свою очередь, на узле эти вычисления могут быть распределены между нитями средствами OpenMP. Основным методом распределения вычислений по узлам является явное задание пользователем распределения между узлами витков цикла. При этом каждый виток такого цикла полностью выполняется на одном узле. Выполнение по правилу собственных вычислений операторов вне распределенного параллельного цикла обеспечивается автоматически компилятором, однако это требует существенных накладных расходов. На следующем этапе необходимо организовать доступ к удаленным данным, которые могут потребоваться при вычислении значений собственных переменных. [4] 1.3.1 Преимущества DVM/OpenMPВо-первых, DVM/OpenMP является достаточно высокоуровневым языком параллельного программирования, что придает удобство процессу написания параллельных программ.Во-вторых, DVM/OpenMP-программа - это последовательная программа, снабженная директивами-псевдокомментариями, задающими распределение данных и вычислений. Директивы не видны обычному компилятору. Таким образом программа, написанная на Fortran-DVM/OpenMP может использоваться сразу в четырех качествах:· Последовательная программа на языке Fortran· Параллельная Fortran-OpenMP программа для мультипроцессора· Параллельная Fortran-DVM программа для кластера· Параллельная Fortran-DVM/OpenMP программа для SMP-кластераСоответственно, для однопроцессорной системы, мультипроцессора, кластера и SMP-кластера достаточно поддерживать всего одну версию программы.1.4 Актуальность работыРабота посвящена написанию системы автоматизации распараллеливания программ. Автоматическое распараллеливание последовательных программ предполагает преобразование существующих последовательных программ в параллельный код. В качестве языка параллельного программирования выбран DVM/OpenMP.Данное направление является весьма востребованным по следующим причинам:ь Распараллеливание готовой программы требует от программиста тщательного анализа ее кода (подчас, чужого), что делает процесс распараллеливания достаточно сложным, и подчас приводит к неудовлетворительным результатам. К тому же, в процессе распараллеливания могут быть допущены ошибки. Если бы распараллеливание осуществлялось автоматически, то появление новых ошибок было бы исключено.ь Распараллеливание уже готовых последовательных программ является очень востребованным, особенно в области научного программирования, где за многолетнюю историю жизни языка Fortran была написано огромное количество программ, не потерявших свою актуальность. Таким образом отпала бы необходимость писать все эти программы заново, но уже в параллельном варианте, и появилась бы возможность использовать старые наработки.ь Для различных конфигураций системы и разного размера входных данных, оптимальное распределение вычислений может также отличаться. Человек не всегда способен учесть такие факторы Автоматический распараллеливатель же учитывает конфигурацию кластера при формировании программы, и для нового кластера может формировать наиболее оптимальный код.Постановка задачи1.5 Структура "Системы автоматизации распараллеливания"Данная дипломная работа посвящена разработке блока экспериментальной системы автоматизации распараллеливания, поэтому сначала ознакомимся с её структурой: Рисунок 1. Экспериментальная система автоматизации распараллеливания Пользователь создает последовательную программу на языке Fortran. Программа, поступая в систему автоматизации распараллеливания, проходит анализ, на основании которого формируется База данных. В Базу данных входят: дерево циклов; описания массивов, описание использования массивов в циклах; специальные пользовательские комментарии и прочее. Пользуясь информацией из Базы данных, DVM/OpenMP-эксперт формирует варианты распределения вычислений и данных, и ищет наилучший вариант. Для поиска требуется информация о количестве вычислительных узлов, их производительности, а также латентности вычислительно сети. Далее, База данных подается на вход Генератору, который формирует параллельный код на языке Fortran-DVM/OpenMP. Код программы на выходе системы не изменяется, в него лишь добавляются директивы OpenMP и DVM. 1.6 Цель работы "DVM/OpenMP-эксперт"К моменту написания работы, Система автоматизации распараллеливания содержала блок, именуемый DVM-экспертом. DVM-эксперт, пользуясь результатами анализа программы, распараллеливает программу на языке Fortran-DVM. Целью дипломной работы является доработка DVM-эксперта до DVM/OpenMP-эксперта. DVM/OpenMP-эксперт, пользуясь результатами анализа, распараллеливает программу на языке Fortran-DVM/OpenMP и заносит информацию о полученной параллельной программе в Базу данных. Предыдущие решения "систем автоматизации распараллеливания на SMP-кластер"В настоящее время имеется только одна развивающаяся система автоматизированного распараллеливания для кластеров - Parawise (системы FORGE Magic/DM и BERT77 уже не развиваются и не поддерживаются). Только для нее имеется информация о применимости для реальных Fortran-приложений и эффективности выполнения распараллеленных программ.1.7 Система ParawiseСистема Parawise является коммерческой системой, созданной компанией Parallel Software Products совместно с NASA Ames на базе системы CAPTools, разработанной в Лондонском университете Гринвича в середине 90-х годов. [3] Общая схема процесса получения параллельной программы из последовательной состоит из следующих этапов: o Системе Parawise подаётся на вход программа на языке FORTRAN (F77/F90/F95). o Пользователь выбирает способы анализа данной программы. o Parawise анализирует программу и формирует вопросы, на которые пользователь обязан дать ответ для успешного распараллеливания. o Пользователь следует по построенному системой графу зависимостей, отвечает на поставленные вопросы и участвует в выборе варианта распределения массивов. o Система создаёт параллельный код программы. o Пользователь проверяет результаты распараллеливания, и, если они не удовлетворительные, заново отвечает на поставленные вопросы или изменяет программу. [7] Главным достоинством системы Parawise являются развитые возможности межпроцедурного анализа, которые создавались в течение многих лет. Главный недостаток - программист должен сам принимать ответственное решение о том, какие массивы и каким образом требуется распределить между процессорами. [3] В отличие от Parawise, DVM/OpenMP-экспертом будет использовать диалог с программистом только для уточнения свойств последовательной программы, а выбор наилучших решений по ее распараллеливанию осуществлять полностью автоматически, без участия программиста. К тому же, DVM/OpenMP-эксперт учитывает вычислительную мощность узлов кластера при распределении работы между процессорами. Исследование и построение решения задачи1.8 Автоматическое распараллеливание программ на DVM и DVM/OpenMPПри распараллеливании программы на DVM пользователю необходимо:1) распределить массивы данных между узлами2) распределить витки циклов между узлами по принципу собственных вычислений3) организовать доступ к удаленным данным.При распараллеливании на на DVM/OpenMP пользователю дополнительно следует выполнить еще один шаг:4) распределить витки циклов, распределенные на узел, между ядрами на узле.Отметим, что эти этапы можно выполнить различными способами. Полученные варианты распараллеливания будут иметь различную эффективность.Рассмотрим общий алгоритм работы автоматического распараллеливателя Fortran-программ - DVM-эксперта. Пользуясь результатами анализа последовательной программы, DVM-эксперт формирует варианты распределения данных и вычислений Fortran-программы. Будем называть DVM-вариантом программу на языке Fortran-DVM, сгенерированную DVM-экспертом. DVM-вариант отражает один из способов распараллеливания последовательной программы на языке DVM. DVM-директивы несут для параллельного компилятора информацию о том, как следует выполнить пункты 1) - 3). Вариантов распараллеливания программы для одной Fortran-программы может быть несколько, поэтому среди всех возможных DVM-вариантов следует отыскать наилучший, и выдать его пользователю системы. Чтобы определить, какой из DVM-вариантов лучше, DVM-эксперт обращается к Библиотеке предсказателя производительности DVM-программ, сокращенно Библиотеке DVM-предиктора. DVM-предиктор моделирует параллельное выполнение DVM-программы и вычисляет характеристики эффективности параллельного выполнения DVM-программы. Полученные характеристики позволяют DVM-эксперту выбрать наилучший DVM-вариант.DVM/OpenMP-эксперт является доработкой DVM-эксперта. После генерации вариантов распараллеливания программы на DVM, каждый DVM-вариант следует распараллелить на OpenMP - то есть выполнить пункт 4). Полученные DVM/OpenMP-программы будем называть DVM/OpenMP-вариантами.1.9 Структура DVM-экспертаДля начала, рассмотрим структуру и принцип работы DVM-эксперта, существовавшего до начала работы. Рисунок 2. Схема работы DVM-эксперта База данных подается на вход Блоку поиска DVM-вариантов, который пользуется результатами анализа программы, и формирует варианты распараллеливания программы на DVM (DVM-варианты). Далее, DVM-варианты передаются Блоку поиска наилучшего DVM-варианта, который выбирает решетку процессоров и наилучший вариант распараллеливания программы. Затем Блок записи результатов в Базу данных записывает выбранный вариант распараллеливания в Базу данных. Теперь рассмотрим, как следует изменить структуру DVM-эксперта, чтобы получить DVM/OpenMP-эксперт. Структура DVM/OpenMP-экспертаРисунок 3. Схема работы "DVM/OpenMP-эксперта" В DVM/OpenMP-эксперте DVM-варианты, сгенерированные Блоком поиска DVM-вариантов передаются Блоку поиска DVM/OpenMP-вариантов. Этот блок распараллеливает каждый DVM-вариант на OpenMP, выбирая при этом наиболее подходящий способ распараллеливания. Таким образом, из каждого DVM-варианта получается по одному DVM/OpenMP-варианту. Далее отрабатывает Блок поиска наилучшего DVM/OpenMP-варианта, который в качестве результата выдает наилучший DVM/OpenMP-вариант. Блок записи результатов в Базу данных записывает выбранный вариант распараллеливания в Базу данных. Таким образом, следует разработать Блок поиска DVM/OpenMP-вариантов. Блок поиска наилучшего DVM-варианта следует доработать до Блока поиска наилучшего DVM/OpenMP-варианта. Также подлежит изменению Блок записи результатов в Базу данных. Остальные компоненты останутся без изменений. 1.9.1 Варианты распараллеливания на OpenMPБлок поиска DVM/OpenMP-вариантов получает на вход набор вариантов распараллеливания программы на кластере. Теперь нам требуется добавить еще один уровень параллелизма, и распределить работу, доставшуюся узлу кластера, между ядрами данного узла. DVM-рекомендации позволяют распределить работу по выполнению циклов между узлами кластера. Сначала с помощью специальных DVM-директив между узлами кластера распределяются элементы массивов (блоками). Затем осуществляется распараллеливание циклов по принципу собственных вычислений. Если между витками цикла имеется зависимость по данным, цикл не распараллеливается. Исключение составляют редукционная зависимость и регулярная зависимость. Рассмотрим несколько простых примеров. Пример 1 Пусть DVM-эксперт распараллелил следующий цикл: CDVM$ PARALLEL (i,j) ON a(i,j) do i=1,N do j=1,M A(I, J) = B(J, I) enddo enddo Директива CDVM$ PARALLEL (i,j) ON a(i,j) говорит о том, что виток цикла со значением итераторов (i, j) будет выполняться на то узле, на котором распределен элемента массива a(i, j). Существует два способа распараллелить на OpenMP этот многомерный цикл: распараллелить внутренний или внешний цикл. Вариант 1.1 CDVM$ PARALLEL (i,j) ON a(i,j) !$OMP PARALLEL PRIVATE(i, j) !$OMP DO SCHEDULE (STATIC) do i=1,N do j=1,M A(I, J) = B(J, I) enddo enddo !$OMP END DO !$OMP END PARALLEL Директива !$OMP PARALLEL говорит о том, что на каждом узле начинается параллельная область. То есть на узле создаются нити, между которыми будет распределяться работа. Все порождённые нити исполняют один и тот же код, соответствующий параллельной области. Предполагается, что в SMP-системе нити будут распределены по различным ядрам процессора. Клауза PRIVATE(i, j) означает, что для каждой нити выделяется локальная память под две переменные: i и j. Действительно, у каждой нити должен быть свой итератор цикла. По достижении директивы !$OMP END PARALLEL нити останавливают свою работу, и на узле остается работать только одна мастер-нить. Директива !$OMP DO сообщает нам, что далее в программе следует цикл, витки которого будут распределяться между нитями. Клауза SCHEDULE (STATIC) гласит, что все множество итераций внешнего цикла делится на непрерывные куски примерно одинакового размера, и полученные порции итераций распределяются между нитями. Директива !$OMP END DO сообщает об окончании параллельного цикла. Происходит неявная барьерная синхронизация нитей и неявный вызов !$OMP FLUSH. Выполнение FLUSH предполагает, что значения всех переменных (или переменных из списка, если он задан), временно хранящиеся в регистрах и кэш-памяти текущей нити, будут занесены в основную память; все изменения переменных, сделанные нитью во время работы, станут видимы остальным нитям. [9] Вариант 1.2 CDVM$ PARALLEL (i,j) ON a(i,j) do i=1,N !$OMP PARALLEL PRIVATE(i, j) !$OMP DO SCHEDULE (STATIC) do j=1,M A(I, J) = B(J, I) enddo !$OMP END DO !$OMP END PARALLEL enddo Отличие этого варианта от предыдущего заключается в том, на каждой итерации внешнего цикла будет создаваться новая параллельная область, то есть будут создаваться нити, и выделяться локальная память для них. Затем нити будут синхронизоваться, выполнять FLUSH и останавливаться. Всё это накладные расходы, которые будут возникать N раз. Еще одно отличие заключается в том, что в этом варианте между нитями распределяются витки внутреннего цикла, а не внешнего. Другим важным критерием, помимо накладных расходов на вызовы библиотеки OpenMP, является загруженность нитей. Если рассматривать первый вариант, то N витков внешнего цикла сначала распределяются между узлами, а потом витки, соответствующие одному узлу, распределяются между ядрами этого узла. Если количество витков цикла меньше суммарного количества ядер нашего SMP-кластера, то некоторые ядра будут простаивать. Если некоторый цикл способен загрузить не более чем по одному ядру на каждом узле, то распараллеливать на OpenMP такой цикл смысла не имеет. Пример 2 Пусть DVM-эксперт распараллелил то же самый цикл следующим образом: CDVM$ PARALLEL (i,j) ON a(*,j) do i=1,N do j=1,M A(I, J) = B(J, I) enddo enddo Отличие этого примера от предыдущего заключается в распределении данных. Здесь, между узлами одномерной процессорной решетки распределено только второе измерение массива A. Соответственно, между узлами будут распределяться только итерации внутреннего цикла. Таким образом, если количество витков внешнего цикла меньше суммарного количества ядер нашего SMP-кластера, но больше количества ядер на одном узле, то распараллеливание на OpenMP внешнего цикла позволит загрузить все ядра (заметим, что в варианте 1.1 на каждом узле работало бы не более одного ядра). Для этого примера также существует два варианта распараллеливания, аналогичных вариантам 1.1 и 1.2. Пример 3 Пусть DVM-эксперт распараллелил следующий цикл: CDVM$ PARALLEL (i,j) ON a(i,j), *DVM$* REDUCTION (SUM(s)) do i=1,N do j=1,M S = S + A(I, J) enddo enddo Клауза REDUCTION (SUM(s)) означает, что каждый узел создаст в своей локальной памяти редукционную переменную, и будет накапливать в ней суммы элементов массива. По окончанию цикла эти локальные переменные будут просуммированы и записаны в s. В таком случае мы по-прежнему имеем два варианта распараллеливания: |
Вариант 3.1 | Вариант 3.2 | | CDVM$ PARALLEL (i,j) ON a(i,j), *DVM$* REDUCTION (SUM(s)) !$OMP PARALLEL PRIVATE(i, j) !$OMP*REDUCTION(+: s) !$OMP DO SCHEDULE (STATIC) do i=1,N do j=1,M S = S + A(I, J) enddo enddo !$OMP END DO !$OMP END PARALLEL | CDVM$ PARALLEL (i,j) ON a(i,j), *DVM$* REDUCTION (SUM(s)) do i=1,N !$OMP PARALLEL PRIVATE(i, j) !$OMP*REDUCTION(+: s) !$OMP DO SCHEDULE (STATIC) do j=1,M S = S + A(I, J) enddo !$OMP END DO !$OMP END PARALLEL enddo | | |
Клауза REDUCTION(+: s) означает, что каждая нить создаст в своей локальной памяти редукционную переменную, и будет накапливать в ней суммы элементов массива. По окончанию цикла эти локальные редукционные переменные нитей будут просуммированы и записаны в локальную редукционную переменную узла. В варианте 3.1 локальные редукционные переменные нитей будут суммироваться по окончании внешнего цикла. В варианте 3.2 локальные редукционные переменные нитей суммируются на каждой итерации внешнего цикла, и это снова дополнительные накладные расходы. Пример 4 Рассмотрим пример с регулярной зависимостью: CDVM$ PARALLEL (i,j) ON a(i,j), *DVM$* ACROSS (a(1:1,1:1)) do i=2,N-1 do j=2,M-1 A(I, J) = A(I-1, J) + A(I+1, J) * + A(I, J-1) + A(I, J+1) enddo enddo Тело данного цикла примечательно тем, что невозможно независимое выполнение витков цикла, т.к. прежде чем вычислить A(I, J), необходимо вычислить A(I-1, J) и A(I, J-1). Прежде всего, клауза ACROSS (a(1:1,1:1)) определяет точное местоположение удаленных данных (теневые грани). Также ACROSS обеспечивает сохранение порядка вычислений витков цикла. Для распараллеливания на OpenMP циклов с регулярной зависимостью используется алгоритм конвейерного выполнения при помощи синхронизующего массива. Этот алгоритм применялся в тестах NAS [12]. Цикл с регулярной зависимостью должен содержать тесно-вложенный цикл. Вариант распараллеливания здесь всего один: Вариант 4.1 CDVM$ PARALLEL (i,j) ON a(i,j), *DVM$* ACROSS (a(1:1,1:1)) !$OMP PARALLEL PRIVATE(IAM, NUMT, ILIMIT, i, j) !$ IAM = omp_get_thread_num () !$ NUMT = omp_get_num_threads () !$ ISYNC (IAM) = 0 !$ ILIMIT=MIN(NUMT-1, N-3) !$OMP BARRIER do i=2,N-1 !$ IF (IAM .GT. 0 .AND. IAM .LE. ILIMIT) THEN !$ DO WHILE (ISYNC(IAM-1) .EQ. 0) !$OMP FLUSH (ISYNC) !$ ENDDO !$ ISYNC(IAM-1)=0 !$OMP FLUSH (ISYNC) !$ ENDIF !$OMP DO SCHEDULE (STATIC) do j=2,M-1 A( I, J ) = A( I-1, J ) + A( I+1, J ) + * A( I, J-1 ) + A( I, J+1 ) enddo !$OMP END DO NOWAIT !$ IF (IAM .LT. ILIMIT) THEN !$ DO WHILE (ISYNC (IAM) .EQ. 1) !$OMP FLUSH (ISYNC) !$ ENDDO !$ ISYNC (IAM)=1 !$OMP FLUSH (ISYNC) !$ ENDIF enddo !$OMP END PARALLEL Предположим, что N = 7, M = 14, а количество нитей - 4. Принцип конвейерного выполнения отображен на рисунке. |
| Нить 1 | Нить 2 | Нить 3 | Нить 4 | | Массив A | J = 2…4 | J = 5…7 | J = 8…10 | J = 11…13 | | I = 2 | Такт 1 | Такт 2 | Такт 3 | Такт 4 | | | | | | | | | | | | | | | | I = 3 | Такт 2 | Такт 3 | Такт 4 | Такт 5 | | | | | | | | | | | | | | | | I = 4 | Такт 3 | Такт 4 | Такт 5 | Такт 6 | | | | | | | | | | | | | | | | I = 5 | Такт 4 | Такт 5 | Такт 6 | Такт 7 | | | | | | | | | | | | | | | | I = 6 | Такт 5 | Такт 6 | Такт 7 | Такт 8 | | | | | | | | | | | | | | | | |
Рисунок 4. Иллюстрация принципа конвейерной работы Такт 1. Нить 1 выполняет три витка цикла: (I = 2, J = 2), (I = 2, J = 3), (I = 2, J = 4). Все остальные нити ждут. Таким образом, элементы массива A(2,2), A(2,3), A(2,4) получают новые значения. Такт 2. Работают 1-я и 2-я нить. Нить 1 выполняет три витка цикла: (I = 3, J = 2), (I = 3, J = 3), (I = 3, J = 4). Отметим, что A(2, 2), A(2, 3) и A(2, 4), требуемые для вычисления A(I, J) для 1-й нити в текущем такте, уже содержат новое значение. Аналогично, нить 2 выполняет три витка: (I = 2, J = 5), (I = 2, J = 6), (I = 2, J = 7). Элемент A(2, 4), требуемый для вычисления A(2, 5), был уже посчитан 1-й нитью в 1-м такте. Такт 3. Работают 1-я, 2-я и 3-я нить. Каждая нить выполняет по три витка. Для каждого элемента A(I, J), обрабатываемого в текущем такте, элементы A(I-1, J) и A(I, J-1) уже содержат новое значение. Такт 4, 5, 6, 7, 8 - аналогично. Таким образом, порядок вычисления витков при параллельной работе нитей сохраняется. В работе конвейера можно отметить три этапа: · Разгон конвейера (Такты 1,2,3). · Работа с полной загрузкой (Такты 4,5). · Остановка конвейера (Такты 6,7,8). Пример 5 CDVM$ PARALLEL (i,j,k) ON a(i,j,k), *DVM$* ACROSS (a(0:0,1:1,0:0)) do i=1,N-1 do j=1,M do k=1,P A( I, J, K ) = (A( I, J, K ) + A( I, J, K ) + * A( I, J-1, K ) + A( I, J+1, K )) enddo enddo enddo Здесь регулярная зависимость присутствует только по второму измерению массива A. Соответственно, внешний или внутренний цикл можно распараллелить с помощью OMP PARALLEL DO, а для среднего можно организовать конвейер. Вариант 5.1 CDVM$ PARALLEL (i,j,k) ON a(i,j,k), *DVM$* ACROSS (a(0:0,1:1,0:0)) !$OMP PARALLEL PRIVATE(j, i, k) !$OMP DO SCHEDULE (STATIC) do i=1,N-1 do j=1,M do k=1,P A( I, J, K ) = (A( I, J, K ) + A( I, J, K ) + * A( I, J-1, K ) + A( I, J+1, K )) enddo enddo enddo !$OMP END DO !$OMP END PARALLEL Вариант 5.2 CDVM$ PARALLEL (i,j,k) ON a(i,j,k), *DVM$* ACROSS (a(0:0,1:1,0:1)) do i=1,N-1 !$OMP PARALLEL PRIVATE(IAM, NUMT, ILIMIT, j, k) !$ IAM = omp_get_thread_num () !$ NUMT = omp_get_num_threads () !$ ISYNC (IAM) = 0 !$ ILIMIT=MIN(NUMT-1, 11) !$OMP BARRIER do j=1,M !$ IF (IAM .GT. 0 .AND. IAM .LE. ILIMIT) THEN !$ DO WHILE (ISYNC(IAM-1) .EQ. 0) !$OMP FLUSH (ISYNC) !$ ENDDO !$ ISYNC(IAM-1)=0 !$OMP FLUSH (ISYNC) !$ ENDIF !$OMP DO SCHEDULE (STATIC) do k=1,P A( I, J, K ) = (A( I, J, K ) + A( I, J, K ) + * A( I, J-1, K) + A( I, J+1, K )) enddo !$OMP END DO NOWAIT !$ IF (IAM .LT. ILIMIT) THEN !$ DO WHILE (ISYNC (IAM) .EQ. 1) !$OMP FLUSH (ISYNC) !$ ENDDO !$ ISYNC (IAM)=1 !$OMP FLUSH (ISYNC) !$ ENDIF enddo !$OMP END PARALLEL Enddo Вариант 5.3 CDVM$ PARALLEL (i,j,k) ON a(i,j,k), *DVM$* ACROSS (a(0:0,1:1,0:0)) do i=1,N-1 do j=1,M !$OMP PARALLEL PRIVATE(j, k) !$OMP DO SCHEDULE (STATIC) do k=1,P A( I, J, K ) = (A( I, J, K ) + A( I, J, K ) + * A( I, J-1, K) + A( I, J+1, K )) enddo !$OMP END DO !$OMP END PARALLEL enddo enddo Практическая реализация1.10 Список используемых терминовТесно-вложенные циклы - два цикла, расположенные таким образом, что один цикл является телом другого цикла.Гнездо циклов - набор циклов, расположенных таким образом, что один цикл является телом другого цикла, гнездо циклов может состоять из одного цикла.Внешний цикл в гнезде - цикл, который не вложен ни в один из циклов гнезда.Внутренний цикл в гнезде - цикл, в который не вложен ни один из циклов гнезда.Гнездо циклов распараллелено на DVM - витки циклов, принадлежащих гнезду, распределяются между узлами с помощью DVM-директив.Гнездо циклов распараллелено на OpenMP - один из циклов гнезда распараллелен на OpenMP.Интервал - некоторый участок выполнения программы. В дальнейшем нас будет интересовать только два вида интервалов: гнездо циклов и тело всей программы.Внутреннее представление DVM-эксперта - набор структур, хранящих информацию о программе. DVM-эксперт заполняет эти структуры, пользуясь информацией из Базы данных.
Страницы: 1, 2
|
|