Използване на високоефективен Fortran в IHPC&DB

Бележка за начинаещ потребител

Без да искам да преоткривам колелото, ще отговоря на въпроса с цитат от класиците: „High Performance Fortran (HPF) е набор от разширения към стандарта Fortran 90, който позволява на програмистите да определят как данните да бъдат разпределени между множество процесори. Конструкциите на HPF позволяват на програмистите да посочват потенциален паралелизъм на относително високо ниво, без да навлизат в детайлите на ниско ниво на предаване на съобщения и синхронизиране Когато се компилира HPF програма, компилаторът поема отговорността за планирането на паралелните операции на физическите машини, което значително намалява времето и усилията, необходими за разработката на паралелна програма. За подходящи приложения паралелните програми могат да се изпълняват драстично по-бързо от обикновените Fortran програми."

Тази техника на програмиране се нарича "паралелен модел на данни". Той, за разлика от основните модели на паралелно програмиране (модели със споделена памет и модели с предаване на съобщения), е абстрактен. Действително HPF дефинира разпределението на данните между устройствата (по-точно разпределението на операциите върху данните), но не уточнява как се преместват данните. Да кажем, че програмата казва: . HPF компилаторът/препроцесорът, в зависимост от действителните стойности на I и J за последния ред, ще трябва да произведе следния машинен код:

A(I) и B(J) са присвоени на.HPF ще преведе израза в.
. същия клон. инструкция за копиране на данни от памет в памет
. различни клонове на един и същ процесор или SMP машина. инструкция за копиране, рамкирана от извиквания на функции за синхронизиране чрез семафори
. различни клонове, разположени на различни възли. извикване на функцията за прехвърляне на съобщения

HPF силни страни:

  • лъвският дял от работата по паралелизиране е автоматизирана,
  • текстът ясно разделя действията, съставляващи алгоритъма, и действията за оптимизирането му; записът на алгоритъма не губи видимост,
  • обратна съвместимост със стандартния Fortran: това означава, че алгоритъмът може да бъде дебъгван, без да включва паралелизиране; и програмата все още може да бъде компилирана без HPF,
  • HPF директивите не засягат резултата от работата, а само скоростта на получаването му, тоест не могат да превърнат работеща програма в неработеща.

Тази много схематична таблица ще ви помогне да разберете мястото на HPF в йерархията на инструментите за паралелно програмиране, както си го представям:

Мобилни инструменти, специфични за платформатаавтоматиченполуавтоматиченчисто комуникация
Превключвател на компилатора -O2, оптимизирани версии на стандартни библиотекиForge (?няма данни)
C: #pragma _CNX. Fortran: C$DIR .HPF
Вграден Parix, ShMemMPI, PVM

Позицията на паралелизираните версии на библиотеки като Linpack в дясната колона се определя по донякъде субективен начин:

  • ако библиотеката е толкова удобна, че нейната "последователна" версия се използва и от програмиста (за създаване на очевидно непаралелни приложения), тогава нейното място е в горната клетка (като пример ще дадем различни реализации на OpenGL),
  • всичко останало може да се постави в средната клетка.

В момента не се планира поддръжка на потребители от отдела за системна интеграция. HPF вече е инсталиран на няколко компютъра в DPT (те са обсъдени по-долу) ипо искане на потребителите, най-вероятно може да се инсталира на други машини - и това е всичко. Това означава: без семинари, без уроци и почти никакви консултации; и така нататък, докато n@h@lst0 изрично реши, че наистина се нуждаем от HPF. Междувременно: ако имате нужда от HPF - трябва да сте готови да го научите сами.

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

  • Централен сайт на HPF
  • HPF изхвърляне в университета Корнел
  • Раздел на уебсайта на LPIT NIVC MSU, в момента почти празен

* Първите са създадени от големи производители на компютри. По правило обработката на HPF директиви е вградена в съществуващ Fortran компилатор. Резултатът е директно генериран машинен код.

Тази реализация на HPF е ефективна (работи бързо, добре е съвместима с обикновен Fortran и се оптимизира добре), но не е преносима: нито самият HPF компилатор, нито резултатът от неговата работа могат да се използват на друг компютър.

Цената на програмата в този случай е включена в цената на компютъра. Понастоящем в DPT няма такива компютри, които да включват HPF в комплекта за доставка.

* Последните са създадени от независими разработчици на софтуер. Тези инструменти се изпълняват под формата на препроцесор: на входа те вземат изходния текст в HPF, на изхода издават текста на програмата в обикновен Fortran. В изходния текст алгоритъмът вече е изрично паралелен в клонове; той съдържа извиквания на функции за прехвърляне на данни между клонове. Полученият текст се компилира от Fortran с библиотека от функции за пренос на данни.

Предимство на препроцесора: прехвърляме самия препроцесор (самият той може да бъде инсталиран навсяка машина) и ако изгражда изходния текст с помощта на мобилна комуникационна библиотека (например PVM или MPI), тогава резултатът от работата му също е преносим.

Недостатък: текстът се анализира два пъти: първо от препроцесора, след това от компилатора; по този начин се намалява общата скорост на изграждане на програмата. Препроцесорът е тежък, защото трябва до голяма степен да дублира работата по анализиране, извършена от компилатора.

Такива програми се разпространяват като независими търговски продукти. Най-известният е пакетът Forge от Applied Parallel Research.

Успях да намеря само един HPF препроцесор, който се разпространява не само за пари, но и (в много съкратена форма) като обществено достояние - това е Adaptor. В момента е инсталиран на два DPT компютъра: SPP-1600 и PowerMouse.

Настройка на средата. Въведете от командния ред или още по-добре поставете следните команди в начален файл във вашата домашна директория:

  • Ако имате csh или tcsh (стартов файл .cshrc):
  • Ако имате sh, bash или ksh (начален .profile файл):
Ако командите са поставени в стартовия файл, не забравяйте да прекратите/стартирате сесията, за да влязат в сила настройките.

Преобразуването на HPF->Fortran се извършва от помощната програма fadapt. Например: ще генерира файла pi3.f, който от своя страна трябва да компилирате с Fortran. Командният ред на Fortran трябва да съдържа имената на комуникационните библиотеки, изисквани от адаптера, например:

Полученият .f файл съдържа изходния текст на всички разклонения наведнъж. Впоследствие ще бъдат стартирани няколко идентични копия на компилираната от него програма, всяко от които в зависимост от серийния си номер в екипа ще премине към съответната част от изчисленията. ТакиваОрганизационният модел се нарича SPMD (единична програма - множество данни) и е частен случай на модела MIMD (множество инструкции - множество данни).

Като правило не е нужно ръчно да извиквате fadapt, тъй като.

HPF приложенията се създават автоматично с помощта на помощната програма gmdhpf. Той последователно извиква препроцесора (fadapt), компилатора и линкера. Имената на програмите, ключовете, имената на библиотеките се четат от $/.adprc и $/.adprc файлове. Сега процесът на изграждане става много прост: Полезни ключове:

Методът за стартиране на полученото приложение зависи от конкретната платформа и комуникационна библиотека, използвани от адаптера. Вижте примерите за стартиране на SPP/SHM и Parix/MPI по-долу.

Източници на информация:

  • уебсайт на адаптера,
  • Директория с документация на същия сайт,
  • ръчни страници,
  • 3 файла във формат PostScript, налични на сайта, също са включени в пакета за разпространение и се намират в поддиректорията docs/. Това е:
  • Ръководство за инсталиране (по-специално съдържа описание на файла .adprc),
  • упътване за употреба,
  • Ръководство за програмисти (съдържа само разлики от стандарта и не е пълно ръководство само по себе си).
  • Файлът с описание на библиотеката за изпълнение на DALIB е достъпен само на сайта, но не е включен в разпространението.

Същият пример беше изпробван на всички машини: изчисляване на числото Пи. При него поне всичко работи добре. Въпреки това, няма гаранция, че работата на по-сложно приложение няма да доведе до повреди във HPF на един или друг етап.

SPP-1600. Адаптерът използва функциите на споделена памет (shmop) и семафор (semop) като интерфейс на ниско ниво. Полученият изпълним файл работи както обикновено. Брой създадени паралелни процесиизисква се от конзолата при стартиране. Препоръчително е да посочите 4 или 8 = брой процесори. gmdhpf, срив с грешка „Грешка на сегментиране, изхвърлено ядро“. Както показа проучването, това се случва в зависимост от това кои ключове сте посочили. Например ключовете "-o", "-n", "-dryrun" причиняват срив, но ключът "-v" не го прави. В случай на повреда, ще трябва ръчно да извикате fadapt и fort77, което ще изисква името на библиотеката /users/il/adp_6.0/dalib/SHM/dalib.a -->

  • Изграждане: Или ръчно:
  • поколение .hpf --> .f Имам междинен файл
  • Компилиране и свързване:
  • Изпълнение (въведеното от потребителя е подчертано):
  • Имайте предвид, че производителността на 4-процесорен комплекс е почти точно 4 пъти по-бърза от еднопроцесорен - има 3 причини за това:
    • задачата е много добре паралелизирана (изчисляването на pi е класически пример за паралелизация),
    • броят на повторенията е избран да бъде много голям,
    • при SMP машините комуникацията между клоновете е много бърза – през паметта (но SMP машините са най-скъпите и най-малко мащабируеми); този фактор обаче е напълно изравнен с предишните два.

    PowerMouse, CC/16, CC/20. Интерфейсът от ниско ниво за адаптера е Embedded Parix. (Първоначално беше използвана и остава достъпна втората опция: DALIB е изграден върху MPI, а за MPI на свой ред интерфейсът от по-ниско ниво е Parix).

    Помислете за същите стъпки:

    • Сграда:
    • Стартиране:

    За да овладеете HPF, силно се препоръчва да изберете най-малко натоварения Parsitek или SPP. Не забравяйте, че Parix е система за един потребител и една задача, така че ако един реши да тренира, другите ще го направятпринудени да почиват.

    След като Adapter изгради текста на програмата на Fortran, но преди програмата да бъде призната за работеща и ефективна, тя трябва да премине през още поне три етапа определен брой пъти:

    • компилация със стандартен Fortran,
    • отстраняване на грешки,
    • профилиране.
    Основните разлики във всеки от трите етапа са описани по-долу.

    Трябва да се въздържате от използване на всякакви директиви, включващи паралелизиране (разклоняване), тъй като това вече е направено от HPF. В SPP ключът на компилатора "+Onoparallel" е отговорен за това, в компилаторите на Parsitec такава оптимизация изобщо липсва.

    Тъй като Fortran не разбира разширението .hpf, ще трябва да направите копие с разширение .f, например: Имайте предвид, че имената не са еднакви, защото името progname.f се използва от Adapter за междинния файл, който генерира.

    Наличието на добри профайлери в търговските версии на HPF е основното им предимство. Стандартните профайлъри, с които разполагаме са:

    • неподвижни и нееднородни,
    • предназначени предимно за отстраняване на грешки в програми с една нишка,
    • обектите на статистика за тях са функции, а не селективни по-малки части от код и не обектни файлове.

    Трябва да се отбележи, че профилирането трябва да се извърши точно на машината, на която впоследствие програмата ще бъде стартирана в работен режим. Това изискване се основава на различното съотношение на скоростта на комуникация и изчислителната скорост на различните типове машини: на SPP е по-високо, на Parsitecs е по-ниско и т.н.

    Всъщност единственият начин, който в момента може да се препоръча, е ръчното подреждане на двете повиквания в изходния текст на .hpfфункции: system_clock и cpu_time, които връщат съответно астрономическо и процесорно време. Разработването на методология за профилиране на HPF приложения само с публично достъпни инструменти е много спешна задача - но в същото време е и много нетривиална.

    Този раздел е от интерес само за системните администратори, тоест тези, които ще инсталират адаптер, а не да го използват. И така:

      adp_6.0/dalib/timing.m4 беше пренаписан от мен, защото по мое мнение беше реализиран не съвсем правилно като цяло и напълно грешен за Embedded Parix в частност.

    Правилни стойности за директиви в adp_6.0/dalib/. /Makefile: Това изискване е общо за всички комуникационни интерфейси.

    Препоръчителна стойност за PPC_env в adp_6.0/src1/include/gmdhpfglobal.h:

  • Първоначално пакетът [DALIB-PowerMPI-EPX] работеше на Parsitecs. DALIB е пренесен към Embedded Parix за опростяване на дизайна.