= HPF =

Welcome to High Performance Fortran

Памятка для начинающего пользователя

[ Автор: Илья Евсеев ]
[ Организация: ИВВиБД ]
[ Подразделение: ЦСТ ]

 


Содержание

 


Что такое HPF?

Не желая изобретать велосипед, отвечу на поставленный вопрос цитатой из классиков: "High Performance Fortran (HPF) is a set of extensions to the Fortran 90 standard that permits programmers to specify how data is to be distributed across multiple processors. HPF's constructs allow programmers to indicate potential parallelism at a relatively high level, without entering into the low-level details of message-passing and synchronization. When an HPF program is compiled, the compiler assumes responsibility for scheduling the parallel operations on the physical machines, greatly reducing the time and effort required for parallel program development. For appropriate applications, parallel programs can execute dramatically faster than ordinary Fortran programs."

Итак, High Performance Fortran - это расширение языка Фортран для параллельных вычислительных систем. В текст, написанный на обычном Фортране, вставляются директивы, которые с точки зрения Фортрана являются комментариями. В директивах, в конечном счете, содержатся указания, как данные и операции над ними должны быть распределены по ОЗУ и процессорам.

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

    !HPF$   DISTRIBUTE A BLOCK
    !HPF$   DISTRIBUTE B BLOCK
            INTEGER A(10), B(10)
              ...
            A(I) = B(J)
... компилятор/препроцессор HPF, в зависимости от реальных значений I и J для последней строки, должен будет построить следующий машинный код:
A(I) и B(J) назначены в... HPF оттранслирует выражение в...
...одну и ту же ветвь ...инструкцию копирования данных из памяти в память
...разные ветви на одном процессоре или на SMP-машине ...инструкцию копирования, обрамленную вызовами функций синхронизации через семафоры
...разные ветви, расположенные на разных узлах ...вызова функции передачи сообщения

Достоинства HPF:

Эта весьма схематичная таблица поможет Вам понять место HPF в иерархии программных средств параллельного программирования, как его себе представляю я:

Средства платформенно-зависимые мобильные
автоматические Ключик компилятора -O2,
оптимизированные версии стандартных библиотек
Forge(?нет данных)
полуавтоматические Си: #pragma _CNX ...
Фортран: C$DIR ...
HPF
чисто коммуникационные Embedded Parix, ShMem MPI, PVM

Положение распараллеленных версий библиотек, подобных Linpack, в правом столбце определяется несколько субъективным образом:

Поддержка пользователей Отделом Системной Интеграции в настоящий момент не планируется. HPF сейчас установлен на нескольких компьютерах в ЦСТ (о них речь ниже), а по просьбам пользователей, скорее всего, может быть установлен и на других машинах - и все. Это значит: никаких семинаров, никаких методических пособий, и почти никаких консультаций; и так до тех пор, пока н@ч@лЬств0 в явном виде не решит, что HPF нам действительно нужен. А пока: раз Вам нужен HPF - Вы должны быть готовы изучить его самостоятельно.

 


Где найти информацию?

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

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

 


Как может быть устроен HPF ?

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

* Первые создаются крупными производителями ЭВМ. Как правило, обработка HPF-директив встраивается в уже существующий компилятор Фортрана. На выходе генерируется непосредственно машинный код.
 
Такая реализация HPF эффективна (быстро работает, хорошо совместима с обычным Фортраном и хорошо оптимизирует), но непереносима: ни сам HPF-компилятор, ни результат его работы не могут быть использованы на другой ЭВМ.
 
Стоимость программы в этом случае входит в стоимость компьютера. В ЦСТ на сегодняшний день таких компьютеров, в комплект поставки которых входил бы HPF, нет.

* Вторые создаются независимыми разработчиками программного обеспечения. Эти средства выполняются в виде препроцессора: на входе принимают исходный текст на HPF, на выходе выдают текст программы на обычном Фортране. В выходном тексте алгоритм уже явно распараллелен на ветви, в нем присутствуют вызовы функций передачи данных между ветвями. Полученный текст компилируется Фортраном с библиотекой функций передачи данных.
 
Преимущество препроцессора: переносим сам препроцессор (его самого можно установить на любой машине), и, если он строит выходной текст с использованием мобильной библиотеки связи (например, PVM или MPI), то результат его работы так же переносим.
 
Недостаток: синтаксический разбор текста выполняется дважды: сначала препроцессором, затем компилятором; таким образом, общая скорость построения программы снижается. Препроцессор утяжелен, так как вынужден в значительной мере дублировать работу по синтаксическому разбору, выполняемую компилятором.
 
Такие программы распространяются как самостоятельные коммерческие продукты. Наиболее известен пакет Forge фирмы Applied Parallel Research.

Мне удалось найти только один HPF-препроцессор, который распространяется не только за деньги, но и (в сильно усеченном виде) как public domain - это Adaptor. В данный момент он установлен на двух компьютерах ЦСТ: SPP-1600 и PowerMouse.

 


Правила работы с Adaptor'ом

Настройка окружения. Введите из командной строки, а лучше поместите в стартовый файл в Вашем домашнем каталоге следующие команды:

Если команды помещены в стартовый файл, не забудьте завершить/начать сессию, чтобы настройки вошли в силу.

Преобразование HPF->Fortran выполняет утилита fadapt. Например:

    fadapt -f pi3.hpf
сгенерирует файл pi3.f, который, в свою очередь, Вы должны скомпилировать Фортраном. В командной строке Фортрана должны быть указаны имена требуемых Adaptor'у коммуникационных библиотек, например:
    px fc77 -o pi3.px pi3.f /export/home/il/adp_6.0/dalib/MPI/dalib.a \
        /export/home/parix/mpi/lib/parix/ch_mp/libmpi.a

Полученный файл.f содержит исходный текст всех ветвей сразу. Впоследствии будет запущено несколько идентичных копий скомпилированной из него программы, каждая из которых в зависимости от своего порядкового номера в коллективе приступит к соответствующей части вычислений. Такая организационная модель носит название SPMD (single program - multiple data) и является частным случаем модели MIMD (multiple instructions - multiple data).

Как правило, Вам не придется вручную вызывать fadapt, так как...

Автоматическое построение HPF-приложений выполняет утилита gmdhpf. Она по очереди вызывает препроцессор (fadapt), компилятор и компоновщик. Названия программ, ключи, имена библиотек читаются из файлов ${HOME}/.adprc и ${PHOME}/.adprc. Теперь процесс построения становится очень простым:

    gmdhpf -o pi3.px pi3.hpf
Полезные ключи:
     -v                  подробный вывод
     -dryrun             холостой запуск
     -c                  компиляция; без компоновки
     -o <outfile>        имя для программы (по умолчанию: a.out)
     -keep               не стирать промежуточные файлы
     -settings           вывести текущие настройки

Способ запуска полученного приложения зависит от конкретной платформы и библиотеки связи, используемой Adaptor'ом. Ниже смотрите примеры запуска для SPP/SHM и Parix/MPI.

Источники информации:

 


Замечания по использованию

На всех машинах пробовался один и тот же пример: вычисление числа Пи. С ним, по-крайней мере, все работает нормально. Однако уверенности, что работа более сложного приложения не приведет к сбоям в HPF на той или иной стадии, нет.

SPP-1600. В качестве интерфейса нижнего уровня Adaptor использует функции работы с общей памятью (shmop) и семафорами (semop). Полученный исполняемый файл запускается как обычно. Количество создаваемых параллельных процессов запрашивается с консоли при запуске. Рекомендуется указывать 4 или 8 = числу процессоров.

Заметьте, что быстродействие 4-процессорного комплекса почти ровно в 4 раза выше, чем у однопроцессорного - тому есть 3 причины:

PowerMouse, CC/16, CC/20. Интерфейсом нижнего уровня для Adaptor'a является Embedded Parix. (Изначально использовался, и остается доступным второй вариант: DALIB собран поверх MPI, а для MPI, в свою очередь, интерфейсом нижнего уровня является Parix).

Рассмотрим те же этапы:

Ссылки на наиболее информативные наши страницы по Парситекам:

Для освоения HPF настоятельно рекомендуется выбирать наименее загруженный из Парситеков, либо SPP. Помните, что Parix - это однопользовательская однозадачная система, так что, если один решит поупражняться, другие будут вынуждены отдыхать.

 


Adaptor отработал, что дальше?

После того, как Adaptor построит текст программы на Фортране, но до того, как программа будет признана работающей и эффективной, ей предстоит некоторое число раз пройти еще как минимум через три стадии:

Ниже описываются основные отличия в каждой из трех стадий.

Директивы оптимизации стандартного Фортрана

Вам следует отказаться от использования любых директив, включающих распараллеливание (разбиение на ветви), поскольку оно уже выполнено HPF. На SPP за это отвечает ключ компилятора "+Onoparallel", в компиляторах на Парситеках подобная оптимизация отсутствует вообще.

Отладка, идеальный вариант

С точки зрения Фортрана директивы HPF являются комментариями. Директивы влияют только на скорость, но не на правильность работы. Поэтому можно тот же самый текст скомпилировать Фортраном, минуя Adaptor, и отлаживать как обычную однопоточную программу на любой машине, где есть Фортран и отладчик. Предполагается, что отлаживать обычные программы Вы уже умеете. На тех машинах в ЦСТ, где сейчас установлен HPF, имеются следующие отладчики: gdb (GNU debugger), DeTop на Парситеках и CXdb на SPP. Самый, на мой взгляд, удобный и надежный из них CXdb, а самый мобильный, естественно, gdb.

Поскольку расширение .hpf Фортран не понимает, потребуется сделать копию с расширением .f, например:

ln progname.hpf progname_.f
Обратите внимание, что имена выбраны несовпадающими, поскольку имя progname.f используется Adaptor'ом для генерируемого им промежуточного файла.

Отладка, универсальный вариант

Помимо директив-комментариев, Adaptor предлагает также большой набор полезных подпрограмм, таких как system_clock и cpu_time. При этом в составе Adaptor'a отсутствует библиотека, пригодная для непосредственной компоновки с использующей их (функции) Фортрановской программой. Вместо этого предлагается следующая схема:

Профилирование

Наличие хороших профайлеров в коммерческих версиях HPF составляет главное их достоинство. Имеющииеся в нашем распоряжении стандартные профайлеры:

Следует учесть, что профилирование обязательно должно выполняться именно на той машине, на которой впоследствии программа будет запускаться в рабочем режиме. Это требование основано на разном соотношении скорости коммуникаций и скорости вычислений на разных типах машин: на SPP оно выше, на Парситеках - ниже, и так далее.

Фактически, единственным способом, который на текущий момент можно рекомендовать, является расстановка в исходном тексте.hpf вручную вызовов двух функций: system_clock и cpu_time, которые возвращают астрономическое и процессорное время соответственно. Разработка методики профилирования HPF-приложений только общедоступными средствами является задачей весьма насущной - но при этом и весьма нетривиальной.

 


Как скрестить Адаптор с Парситеком?

Этот раздел интересен только системным администраторам, то есть тем, кто собирается устанавливать Adaptor, а не пользоваться им. Итак:

  1. adp_6.0/dalib/timing.m4 мною переписан, потому что был, на мой взгляд, реализован не вполне корректно в-целом, и совершенно неверно для Embedded Parix'а в-частности.
     
  2. Правильные значения для директив в adp_6.0/dalib/.../Makefile:
        ARCH     = POWER4
        AR       = px ar
        CC       = px ancc
        COPT     = -g $(INC_DIR) -D$(ARCH) -DPowerPC
    Это требование общее для всех коммуникационных интерфейсов.
     
  3. Рекомендуемое значение для PPC_env в adp_6.0/src1/include/gmdhpfglobal.h:
        #define PPC_env   { "cpp", "", \
                            "", "", \
                            "px f77", "-O -w", "", \
                            "px f77", "", "", \
                            "px f77", "", "" }

     
  4. Изначально на Парситеках работала связка [ DALIB-PowerMPI-EPX ].
    С целью упростить конструкцию DALIB портирован под Embedded Parix.

 


Изменения в документе

  • 4 октября 1998
. . . . первая версия
  • 3 ноября 1998
. . . . исправленный вариант теста (pi3.hpf)
  • 2 декабря 1998
. . . . текст документа полностью переработан

.