За допомогою High Performance Fortran в IHPC&DB

Пам'ятка для користувача-початківця

Не бажаючи винаходити велосипед, відповім на поставлене запитання цитатою з класиків: "High Performance Fortran (HPF) is a set of extensions to the Fortran 90 standard that permits programmers to specify how data is to distributed across multiple processors. HPF's constructs allow Визначення потенційного ступеня атмосфери на відносно високому рівні, без введення в низькі рівні details message-passing and synchronization. effort required для parallel програм розвитку.

Така методика програмування отримала назву "модель із паралельними даними". Вона, на відміну від базових моделей паралельного програмування (моделі із загальною пам'яттю та моделі з передачею повідомлень), абстрактна. Дійсно, HPF задається розподіл даних по пристроях (а якщо говорити точніше, то розподіл операцій над даними), але не конкретизується спосіб переміщення даних. Припустимо, у програмі написано: . компілятор/препроцесор HPF, залежно від реальних значень I та J для останнього рядка, повинен буде побудувати наступний машинний код:

A(I) та B(J) призначені в.HPF відтранслює вираз.
. одну й ту саму гілку. інструкцію копіювання даних із пам'яті на згадку
. різні гілки на одному процесорі або на SMP машині. інструкцію копіювання, обрамлену викликами функцій синхронізації через семафори
. різні гілки, розташовані на різних вузлах. дзвінка функції надсилання повідомлення

Переваги HPF:

  • автоматизується левова частка роботи з розпаралелювання,
  • у тексті чітко розділені дії, що становлять алгоритм, та дії щодо його оптимізації; запис алгоритму не втрачає наочності,
  • зворотна сумісність зі стандартним Фортраном: це означає, що алгоритм можна налагоджувати, не включаючи розпаралелювання; а програму, як і раніше, можна компілювати, не маючи HPF,
  • Директиви HPF впливають не на результат роботи, а тільки на швидкість його отримання, тобто не здатні перетворити працюючу програму на непрацюючу.

Ця схематична таблиця допоможе Вам зрозуміти місце HPF в ієрархії програмних засобів паралельного програмування, як його уявляю я:

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

Положення розпаралелених версій бібліотек, подібних до Linpack, у правому стовпці визначається дещо суб'єктивним чином:

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

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

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

  • Центральний сайт HPF
  • Звалище матеріалів по HPF в Корнельському університеті
  • Розділ на сайті ЛПІТ НІВЦ МДУ, на даний момент майже порожній

* Перші створюються великими виробниками ЕОМ. Як правило, обробка HPF-директив вбудовується в існуючий компілятор Фортрана. На виході безпосередньо генерується машинний код.

Така реалізація HPF ефективна (швидко працює, добре сумісна з звичайним Фортраном і добре оптимізує), але непереносима: ні сам HPF-компілятор, ні результат роботи не можуть бути використані на інший ЕОМ.

Вартість програми у разі входить у вартість комп'ютера. У ЦСТ на сьогодні таких комп'ютерів, у комплект постачання яких входив би HPF, немає.

* Другі створюються незалежними розробниками програмного забезпечення. Ці кошти виконуються як препроцесора: на вході приймають вихідний текст на HPF, на виході видають текст програми на звичайному Фортрані. У вихідному тексті алгоритм вже явно розпаралелений на гілки, в ньому є виклики функцій передачі даних між гілками. Отриманий текст компілюється Фортраном із бібліотекою функцій передачі.

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

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

Такі програми поширюються як самостійні комерційні товари. Найбільш відомий пакет Forge фірми Applied Parallel Research.

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

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

  • Якщо у Вас є csh або tcsh (стартовий файл .cshrc ):
  • Якщо у Вас sh, bash або ksh (стартовий файл .profile):
Якщо команди поміщені у стартовий файл, не забудьте завершити/почати сесію, щоб налаштування набули чинності.

Перетворення HPF->Fortran виконує утиліта fadapt. Наприклад: згенерує файл pi3.f, який, у свою чергу, Ви повинні скомпілювати Фортраном. У командному рядку Фортрана мають бути вказані імена необхідних Adaptor'у комунікаційних бібліотек, наприклад:

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

Як правило, Вам не доведеться вручну викликати fadapt, оскільки.

Автоматичну побудову HPF-додатків виконує утиліта gmdhpf. Вона по черзі викликає препроцесор (fadapt), компілятор та компонувальник. Назви програм, ключі, імена бібліотек читаються із файлів $/.adprc та $/.adprc . Тепер процес побудови стає дуже простим: Корисні ключі:

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

Джерела інформації:

  • Сайт Adaptor'a,
  • Каталог з документацією на тому ж сайті,
  • Manual pages,
  • 3 файли у форматі PostScript, наявні на сайті, також входять до складу дистрибутива, і розташовані в підкаталозі docs/. Це:
  • Install guide (зокрема, містить опис файлу .adprc ),
  • Users guide,
  • Programmers guide (містить лише відмінності від стандарту і сам собою повноцінним керівництвом не є).
  • Файл з описом бібліотеки часу виконання (run-time library) DALIB є лише на сайті, а дистрибутив не включений.

На всіх машинах пробувався той самий приклад: обчислення числа Пі. З ним, принаймні, все працює нормально. Однак впевненості, що робота складнішого додатку не призведе до збоїв у HPF на тій чи іншій стадії, немає.

SPP-1600. Як інтерфейс нижнього рівня Adaptor використовує функції роботи із загальною пам'яттю (shmop) та семафорами (semop). Отриманий виконуваний файл запускається як завжди. Кількість створюваних паралельних процесівзапитується з консолі під час запуску. Рекомендується вказувати 4 або 8 = числу процесорів. gmdhpf, раз у раз звалюючись з помилкою "Segmentation fault, core dumped". Як показало проведене дослідження, це залежить від того, які ключі Ви вказали. Наприклад, ключі "-o", "-n", "-dryrun" викликають збій, а ключ "-v" - ні. У разі збою Вам доведеться вручну викликати fadapt і fort77 , при цьому в командному рядку останнього потрібно буде вказувати назву бібліотеки /users/il/adp_6.0/dalib/SHM/dalib.a -->

  • Побудова: Або вручну:
  • Генерація .hpf --> .f Отримали проміжний файл
  • Компіляція та компонування:
  • Запуск (введення користувача підкреслено):
  • Зверніть увагу, що швидкодія 4-процесорного комплексу майже рівно в 4 рази вище, ніж у однопроцесорного - тому є 3 причини:
    • завдання дуже добре розпаралелюється (обчислення числа Пі - це класичний приклад на розпаралелювання),
    • кількість ітерацій вибрано дуже великою,
    • в SMP-машинах зв'язок між гілками дуже швидкий - через пам'ять (але зате SMP-яшини найдорожчі і найменш масштабовані); втім, цей фактор абсолютно нівельований двома попередніми.

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

    Розглянемо самі етапи:

    • Побудова:
    • Запуск:

    Для освоєння HPF рекомендується вибирати найменш завантажений з парситек, або SPP. Пам'ятайте, що Parix - це однокористувальна однозадачна система, так що якщо один вирішить повправлятися, інші будутьзмушені відпочивати.

    Після того, як Adaptor побудує текст програми на Фортрані, але до того, як програма буде визнана працюючою та ефективною, їй доведеться кілька разів пройти ще як мінімум через три стадії:

    • компіляція стандартним Фортраном,
    • налагодження,
    • профільування.
    Нижче описуються основні відмінності у кожній із трьох стадій.

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

    Оскільки розширення .hpf Фортран не розуміє, потрібно зробити копію з розширенням .f , наприклад: Зверніть увагу, що імена вибрані несхожими, оскільки ім'я progname.f використовується Adaptor'ом для проміжного файлу, що генерується ним.

    Наявність хороших профайлерів у комерційних версіях HPF становить головну їхню гідність. Стандартні профайлери, що є в нашому розпорядженні:

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

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

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

    Цей розділ цікавий лише системним адміністраторам, тобто тим, хто збирається встановлювати Adaptor, а не користуватися ним. Отже:

      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]. З метою спростити конструкцію DALIB портований під Embedded Parix.