Частково, такий підхід був реалізований в проекті VampirTrace, [146] що надають додаткову функціональність бібліотеки OpenMPI, так щоб при виклику функцій бібліотеки вироблялися відповідні записи в файл трасування формату Open Trace Format. Останній є відкритим форматом для зберігання файлів, що містять інформацію профілювання для паралельних систем.
Програма, яка скомпільована з використанням інструментованої бібліотеки, під час роботи генерує список подій, що включають:
• виклики функцій, визначаються користувачем, і повернення з них;
• виклики підпрограм MPI і повернення з них;
• виконання вводу / виводу;
• передача даних між вузлами;
• зміна значень заданих лічильників, таких як розмір використаної оперативної пам'яті;
та додаткову інформацію про час даної події і його параметрах. Генерація побудована таким чином, що перед початком роботи виконується синхронізація в часі, тривалість якої не враховується в результуючих даних, що дозволяє далі об'єднати файли трасування різних процесів в єдиний глобальний список подій.
На даний момент багато розробників бібліотек включають напрацювання проекту VampirTrace в поставку їх продуктів, наприклад, в OpenMPI [147] за замовчуванням передбачена можливість генерації файлів трасування, починаючи з версії 1.3. Оскільки OpenMPI, фактично, є основним засобом програмування розподілених систем, то при розробці доцільно орієнтуватися на аналіз програм, що використовують дану бібліотеку. Для аналізу паралельних програм існує декілька засобів, проте їх функціональність істотно обмежена складністю аналізу. Паралельна програма середньої складності при профілювання генерує мільйони подій в хвилину, що призводить до того, що розмір файлу трасування реальної програми вимірюється сотнями мегабайт.
Оскільки, програмне забезпечення, яке розробляється, орієнтоване на розробників паралельних програм, доцільно використовувати можливості паралельної обробки безпосередньо в продукті, що розробляється. Надалі можна також перейти до використання клієнт-серверної технології для збільшення швидкості обробки інтерактивних запитів користувача.
Засіб динамічного аналізу паралельних програм, що розроблено для розподілених обчислювальних систем надає нижчеописані можливості для профілізації та оптимізації. Пропоновані засоби фокусуються на особливостях розподілених обчислювальних систем, нехарактерних для інших типів систем, які не можуть бути виявлені альтернативними засобами аналізу. Розроблений засіб дозволяє виконувати аналіз процесу виконання програми на реальній системі і аналізувати питання передачі даних і синхронізації між вузлами.
6.7.2. Підходи до трасування програм
Необхідно виконати деякі підготовчі дії для того, щоб при роботі програми отримати файл трасування. Є декілька можливих способів це зробити:
1. При компіляції програми викликати редактор зв'язків з варіантом трасування бібліотеки MPI. У варіанті трасування бібліотеки кожна MPI функція зберігає відомості про виклик до файлів трасувань.
Переваги: не потрібно мати повний початковий код програми, досить об'єктних файлів.
Недоліки: в файлі трасування записується неповна інформація про роботу програми.
2. Модифікація початкового коду. Додаткові оператори записують інформацію трасування про роботу самої програми (тобто, про роботу не-MPI функцій).
Переваги: в файл трасування потрапляє повна інформація про роботу тих ділянок програми, які були модифіковані.
Недоліки:
• необхідна ручна модифікація коду, яка може послужити як джерелом помилок в файлі трасування, так і джерелом помилок у програмі (якщо будуть ненавмисно внесені зміни в обчислювальну частина коду);
• в результаті модифікації отримуємо окремий варіант початкового коду з трасуванням. Якщо налагодження програми закінчено і трасування більше не потрібно, оператори трасування все одно залишаються у початковому коді, і, по-перше, є джерелом накладних витрат, а, по-друге, фактично, є невживаним кодом, коректність якого в процесі подальшої розробки ніяк не контролюється.
3. Автоматичне інструментування початкового коду. Багато компіляторів, наприклад, GCC [145], PGI та інші підтримують автоматичне інструментування початкового коду. Інструментування передбачає автоматичне вбудовування викликів спеціальних трасувань функцій на початку і в кінці кожної функції користувача без фактичної модифікації початкового коду.
Даний підхід є найбільш легким для використання і вимагає найменше часу для виконання підготовчих дій.
До недоліків даного підходу можна віднести вимоги наявності початкового коду. Даний недолік не є істотним, так як розробник програми за визначенням має доступ до її початкового програмного коду. Проте, даний підхід не застосовний для інструментування програм, розроблених третьою стороною, для яких початковий код не доступний.
6.7.3. Поліпшення автоматичного інструментування
Автоматичне інструментування в режимі за замовчуванням передбачає інструментування всіх функцій, вихідний код яких обробляється компілятором. На жаль, це може привести до вибухового зростання розміру файлів трасувань через велику кількість зайвої інформації. Наприклад, в програмах часто оголошуються невеликі, короткі функції, що вбудовуються компілятором в місце виклику. Ці функції використовуються в коді і викликаються дуже часто, в тому числі у внутрішніх обчислювальних циклах. Кожен виклик такої короткої функції (нарівні з іншими функціями) призводить до додавання запису у файл трасування.
Якщо програміст впевнений, що дана функція не є джерелом проблем, він може виключити її з набору інструментованих функцій, використовуючи спеціальні конструкції мови.
Наведемо приклад відключення автоматичного інструментування. Нехай у класі matrix реалізований метод get (i, j), що викликається в програмі велику кількість разів:
class matrix
{
public:
...
inline int get(size_ti, size_tj) const
{
return this->data[i * this->columns + j];
}
...
};
Для відключення автоматичного інструментування метод get (i, j) можна помітити атрибутом __attribute __ ((no_instrument_function)), що призведе код до наступного вигляду:
class matrix
{
public:
...
int get(size_ti, size_tj) const __attribute__((no_instrument_function));
...
};
inline int matrix::get(size_ti, size_tj) const
{
return this->data[i * this->columns + j];
}
6.7.4. Генерація матриці інформаційних потоків
Основною можливістю розробленого засобу аналізу паралельних програм, є можливість генерації топології на основі зібраної статистики виконання завдання. Ця можливість особливо корисна, якщо досліджувана програма реалізує алгоритм зі складним шаблоном взаємодії процесів, як, наприклад, комбінація різних математичних методів, або взагалі відсутній явний регулярний шаблон визначення взаємодіючих процесів. Навіть у цих випадках на основі статистики виконання програми може бути згенерована віртуальна топологія, відповідна даній задачі, що дозволить використовувати всі переваги даної концепції в засобах MPI.
Як показано у відповідному розділі, початковими даними для методу генерації топології є матриця інформаційних потоків. Інформаційний потік визначається обсягом інформації, переданим в одиницю часу. У загальному випадку це значення може змінюватися в часі, проте можна виділити пікове і середнє значення. Для генерації віртуальної топології, яка використовується в усій програмі, доцільно керуватися середнім значенням за весь час виконання програми. Оскільки при даному підході нормалізуючі значення для інформаційних потоків між усіма парами потоків однакові, і так як для алгоритму істотно лише співвідношення числових значень потоків, нормалізуючий коефіцієнт можна замінити на будь-яку константу, зокрема одиницю або мінімальне ненормалізоване значення потоку.
З метою отримання інформації, необхідної для генерації топології, в процесі трасування програми необхідно накопичувати інформацію про всі пересилання даних між процесами в двох напрямках. Під час аналізу трасування інформації необхідно підсумувати обсяги відправлених даних кожним процесом кожному іншому процесу для отримання відповідної (несиметричною) матриці обсягів переданої інформації. Обробка колективних операцій ведеться особливим чином, який дозволяє врахувати точні обсяги даних, переданих кожному окремому процесу. Отримана матриця еквівалентна матриці інформаційних потоків з точністю нормалізуючої константи, і отже може бути використана в алгоритмі генерації топології.
Матриця числових значень не є зручним і наочним способом представлення інформації для візуального аналізу користувачем, тому доцільно замінити числове подання на якесь візуальне, наприклад колірне, кодування.
Розподілені обчислювальні системи є складними комплексними обчислювальними системами, програмування для яких є достатньо трудомістким і вимагає одночасного використання двох концепцій взаємодії між процесами.
Інтерфейс MPI, що має кілька реалізацій у вигляді бібліотек, дозволяє спростити програмування розподілених обчислювальних систем, використовуючи єдину програму для кожного процесора в кожному вузлі розподіленої системи. Програми, що використовують MPI, спираються на пропонований ним стандартний спосіб взаємодії, заснований на передачі повідомлень. Вибір найкращого методу доставки повідомлення в конкретних умовах і його реалізація в даному випадку покладається на реалізацію MPI.
Технологія MPI є найбільш популярною для програмування розподілених систем кластерного типу завдяки простоті використання і великій кількості підтримуваних типів взаємодій. MPI надає можливість здійснювати передачу з блокуванням і без блокування повідомлень, кожна з яких може бути буферизованою і небуферизованою поряд з можливістю виконувати колективні взаємодії в групі процесів. Також в MPI передбачені механізми роботи з групами процесів і можливість організації віртуальних топологій.
Віртуальні топології MPI дозволяють обмежити передбачену за замовчуванням можливість передачі повідомлень між будь-якою парою процесів, явним чином задаючи наявність зв'язків між процесами. Це дозволяє істотно знизити час роботи програми, виключаючи накладні витрати на підтримку невживаних віртуальних каналів передачі повідомлень і обмежуючи завантаженість фізичних каналів. Сучасні реалізації MPI враховують віртуальні топології при розміщенні процесів на вузлах обчислювальної системи. Віртуальні топології також дозволяють формувати регулярні обчислювальні алгоритми в термінах обміну даними між суміжними процесами.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |


