По сравнению с MPI, языковые средства GNS довольно простые и удобные для прикладного специалиста. Однако они беднее по своим функциональным возможностям. В связи с этим, нам представляется, что работы по развитию Фортран GNS могли бы быть продолжены в следующих направлениях.
Разработать расширения языковых средств, ориентированных на современные требования, включая объектную ориентацию (некоторые расширения, ориентированные на современные стандарты Фортрана, как отмечалось выше, уже разработаны).
Реализовать расширенный вариант Фортрана GNS.
Реализовать GNS следующим образом: исходную программу переводить на Фортран 90/95, дополненный вызовами MPI-процедур. Такой подход используется обычно и для реализации HPF (см. 8.2.), т.е. Фортран 90/95 и MPI являются промежуточными при реализации параллельного языка. (Идея промежуточного языка была в свое время успешно апробирована при реализации в нашей стране Алгола и Фортрана на АЛМО [49]).
В результате реализации этих предложений пользователь смог бы получить более простой инструмент, чем MPI и более современные средства, чем Фортран GNS, и появилась бы возможность использовать программы, переведенные с Фортрана GNS, на любой системе, имеющей реализацию Фортрана 90/95 и MPI. Последний фактор способствовал бы повышению конкурентноспособности прикладных программ, поскольку они могли бы работать практически на любой вычислительной системе с распределенной памятью.
7. Средства поддержки параллельности для многопроцессорных систем с общей памятью
7.1 Общие сведения
В системах с общей (разделяемой) памятью (shared memory) несколько физических процессоров могут совместно использовать общую область памяти. Проблемы, которые при этом возникают, решаются с помощью синхронизации процессов.
Для вычислительных машин с общей памятью, так же, как и для других видов архитектуры, разработаны системы, обеспечивающие автоматическое распараллеливание (в тех случаях, где это возможно), системы, в которых пользователь вставляет обращения к библиотечным процедурам, или компилятор распараллеливает обычный последовательный код, используя директивы-комментарии. В нашей стране также были разработаны средства спецификации параллельности для многопроцессорного (с общей памятью) варианта ЕС1191 [21].
Работы по унификации расширений языков средствами спецификации параллелизма выполнялись первоначально группой PCF (Parallel Computing Forum) [50], в дальнейшем X3H5 ANSI [51]. Эти группы объединили представителей крупнейших фирм, которые накопили большой опыт использования многопроцессорных систем с общей памятью. Разработана языково-независимая модель параллелизма и расширения Фортрана на основе этой модели.
Проект X3H5 положен в основу стандарта OpenMP [52, 53]. Спецификации для Фортрана были утверждены в 1997 году, для С/С++ в 1998 году. Работа по дальнейшему развитию OpenMP продолжается [52].
7.2 Модель параллелизма
Концептуальная модель параллелизма, заложенная в X3H5 и OpenMP, очень схожая, хотя имеются некоторые различия в конкретной реализации модели. Ниже кратко описываются основные принципы этой модели.
Программа начинает выполняться как один процесс, который называется главной нитью. Этот процесс выполняется последовательно до тех пор, пока не дойдет до первой директивы, специфицирующей начало параллельной области. В этот момент порождается бригада нитей (процессов). Порождающая (главная) нить является также членом этой бригады. Число нитей в бригаде задается по-разному, например, с помощью переменной окружения или путем вызова соответствующей подпрограммы.
Фрагмент программы внутри параллельной области выполняется всеми нитями бригады на разных процессорах. Главная нить ждет завершения выполнения всех нитей и продолжает выполнение только одна. Такие бригады могут образовываться не один раз.
Внутри параллельной области могут находиться параллельные конструкции (параллельный цикл, параллельные секции), которые определяют распределение (разделение) работы между членами бригады, но которые не создают новых нитей. Допускается вложенность параллельных областей и параллельных конструкций.
Для реализации этой модели в язык вводятся директивы, специфицирующие параллельные области и параллельные конструкции, введены средства синхронизации, набор процедур run-time поддержки и переменные среды.
Схематически эта модель может быть представлена следующим образом:
program
! Активизируется начальный процесс
! Последовательное выполнение
parallel ! Начало параллельной области
! Каждый член бригады выполняет одни и те же действия
pdo i=1, n ! Начало конструкции "параллельный цикл"
! Итерации распределяются среди членов бригады
. . .
end pdo ! Конец конструкции "параллельный цикл"
. . .
psection ! Начало конструкции "параллельные секции"
! Действия выполняются всеми членами бригады
. . .
section ! Параллельная секция
. . .
section ! Параллельная секция
. . .
end psection ! Конец конструкции "параллельные секции"
. . .
end parallel ! Конец параллельной области
! Последовательное выполнение
! Другие параллельные конструкции
. . .
end
7.3 Спецификации для Фортрана
В OpenMP для Фортрана директивы оформляются в виде комментария, начинающегося с символов !$OMP, *$OMP или C$OMP. В X3H5 директивы имеют вид обычных операторов Фортрана (хотя допускается их оформление и в виде комментария), поэтому выбор ключевых слов для таких операторов делался с учетом того, чтобы не было коллизии с ключевыми словами стандартного Фортрана. В Open MP такого принципа не придерживались, коллизии не произойдет, поскольку директивы оформляются как комментарии, но тем не менее нам представляется, что и в этом случае было бы целесообразнее использовать непересекающиеся имена, тем более, что набор таких ключевых слов был уже подготовлен в проекте X3H5. Ниже рассматриваются основные конструкции этих систем (для сокращения префикс комментария опускается).
Конструкция, задающая параллельную область, имеет вид:
PARALLEL [список-спецификаций]
. . .
END PARALLEL
В заголовке в списке спецификаций могут описываться классы данных, условие выполнения и другие дополнительные опции (они несколько отличаются в рассматриваемых системах).
Объекты данных, используемые в таких параллельных конструкциях, могут быть приватными для каждой нити или общими, т.е. разделяемыми между нитями бригады. Счетчики циклов всегда приватные. Имеются и другие классы переменных.
Параллельные конструкции, которые определяют разделение работы между членами бригады, задаются с помощью следующих директив:
Параллельный цикл:
DO-END DO (OpenMP)
PDO-END PDO (X3H5)
Параллельные секции:
SECTIONS - SECTION - END SECTIONS (OpenMP)
PSECTIONS - SECTION - END PSECTIONS (X3H5)
Параллельный цикл определяет распределение итераций между нитями. Конструкция параллельные секции позволяет нескольким нитям выполнить параллельно участок программы, разбитый на независимые секции.
Если внутри параллельной области имеется только одна параллельная конструкция, то допускается укороченная запись заголовка:
PARALLEL DO - END PARALLEL DO
PARALLEL SECTIONS - END PARALLEL SECTIONS (OpenMP)
PARALLEL PDO - END PARALLEL PDO
PARALLEL PSECTIONS - END PARALLEL PSECTIONS (X3H5)
В заголовках всех перечисленных выше конструкций могут быть дополнительные спецификации (класс переменных, дисциплина распределения работы между нитями, способ планирования последовательности выполнения и др.).
Кроме директив, определяющих распределение работ, внутри параллельной области допускается использовать конструкцию SINGLE - END SINGLE, которая указывает, что входящий в нее блок программы выполняется только один раз.
В системе предусматривается неявная синхронизация, которая может автоматически выполняться системой реализации, и средства явной синхронизации, задаваемые пользователем (барьеры, критические области и др.); здесь имеются различия в рассматриваемых системах.
Из встроенных функций отметим следующие: функции, устанавливающие число нитей в бригаде, функции, возвращающие число нитей, возвращающие номер текущей нити в бригаде и др.
8. Средства параллельности, ориентированные на разбиение данных
8.1 Общие сведения
Одним из актуальных направлений в создании языковых средств поддержки параллельности является подход, ориентированный на разбиение данных. Суть этого похода заключается в следующем. В язык вводятся средства, позволяющие пользователю специфицировать разбиение массивов данных и распределить их по процессорам.
Разбиение данных производится исходя из соображения, что операции над двумя или более объектами выполняются быстрее, если они находятся на одном и том же процессоре, и на разных процессорах операции можно выполнить параллельно.
При таком подходе каждый процессор содержит только подмножество распределенных данных; для доступа к данным, хранящимся в другом процессоре, компилятор генерирует операции, обеспечивающие межпроцессорную коммуникацию, которая необходима для такого доступа. При этом от пользователя не требуется явно специфицировать способ синхронизации. Такие средства могут быть использованы для параллельных компьютеров различной архитектуры.
Соответствующие расширения для Фортрана были первоначально разработаны и реализованы в двух проектах: Fortran D (Техасский университет) [54] и Fortran Vienna (Венский университет) [55]. Хотя на концептуальном уровне в этих подходах много общего, языки Fortran D и Fortran Vienna отличаются друг от друга.
8.2 Язык HPF
Дальнейшее развитие этот подход получил в языке HPF (High Performance Fortran) [56], который является расширением Фортрана 90, существенно использует его новые возможности и фактически является международным стандартом.
HPF содержит директивы для описания способов разбиения данных между параллельно работающими процессорами и некоторые средства для явного указания параллельности.
HPF - язык высокого уровня. На программиста возлагается в основном ответственность за распределение данных, а представление программы в виде системы взаимодействующих процессов осуществляется компилятором.
Более новая версия этого языка HPF 2.0 [57] основывается на Фортране 95 и содержит ряд нововведений. В HPF 2.0 внесены серьезные расширения по сравнению с первой редакцией. Поскольку HPF 2.0 является расширением Фортрана 95, все новые черты, которые включены в Фортран 95, неявно включены и в HPF 2.0. Имеются также существенные собственные новшества. Далее мы будем говорить об HPF, имея в виду и первую и вторую редакции.
Директивы HPF имеют вид комментария, который начинается с символов !HPF$, *HPF$ или CHPF$. Для иллюстрации рассмотрим назначение некоторых из этих директив.
Директива DISTRIBUTE определяет способ распределения данных по абстрактным процессорам. Специфицируется характер распределения (блочный, циклический, блочно-циклический) для массива или для каждого измерения. Отображение абстрактных процессоров на физические выполняет система реализации.
Директива ALIGN специфицирует совместное размещение данных, т.е. указываются массивы или их части, которые должны быть распределены на одном и том же абстрактном процессоре; таким образом, директива позволяет специфицировать взаимное выравнивание массивов друг с другом как внутри, так и между размерностями в зависимости от характера вычислений. Эта информация позволяет компилятору минимизировать количество пересылок между процессорами.
В качестве средств явного указания параллельности в первую версию HPF был включен оператор и конструкция FORALL (см. 3.5.). Из описания HPF 2.0 удалено описание FORALL, так как эти средства теперь имеются в основном варианте стандарта Фортрана - в Фортране 95. Директива INDEPENDENT указывает компилятору, что итерации в следующем DO-цикле и операции в следующем FORALL могут выполняться независимо, в любом порядке. Кроме того, для поддержки параллельности в язык добавлены некоторые встроенные функции, включая и справочные. В HPF2 включены некоторые дополнительные средства для спецификации параллельных вычислений.
Поскольку HPF является языком высокого уровня, существуют некоторые операции, которые трудно или невозможно выразить на этом языке. EXTRINSIC процедуры позволяют описать явный интерфейс с процедурами, написанными с использованием других средств, например, различные библиотеки явной поддержки механизма передачи сообщений.
В настоящее время на многих параллельных компьютерах имеются реализации HPF. Компиляторы HPF обычно осуществляют перевод HPF-программ на Фортран 90/95, дополненный вызовами подпрограмм одной из библиотечных систем : MPI, PVM и др.
8.3 Система DVM
Средства распределения данных в отечественной системе DVM (Фортран DVM и C DVM; проекты РФФИ №96-01-1745 и № 99-01-00209 [58-60]) основаны на аналогичных средствах, имеющихся в HPF. В отличие от HPF, в системе DVM имеются дополнительные средства для распределения вычислений, средства спецификации удаленных данных и средства, специфицирующие параллелизм задач.
Такой подход позволяет пользователю лучше учесть особенности архитектуры и создать более эффективную программу, но в то же время возлагает на программиста дополнительную работу, т.е. усложняет программирование. Базовым языком для Фортрана DVM является Фортран 77.
Для обеспечения совместимости с HPF (который фактически является международным стандартом), по нашему мнению, было бы целесообразно развитие языка Фортран DVM в следующем направлении.
В качестве базового языка целесообразно выбрать современный стандарт Фортран 90/95, который реализован на разных платформах практически для всех современных компьютеров.
Все средства, которые имеются и в HPF (или в его стандартном подмножестве), и в DVM, должны полностью совпадать, включая и префикс комментария (полная синтаксическая и семантическая идентичность).
Те средства DVM, которые отсутствуют в HPF, могут иметь собственный префикс комментария (например, CDVM$).
В системе HPF-DVM сделан некоторый шаг для обеспечения совместимости с HPF, но и в этом случае нет полной идентичности со стандартным подмножеством HPF (которое определено в описании языка), и, кроме того, ориентация делается на Фортран 77, а не на подмножество Фортрана 90.