
- •12.Параллельные численные методы. Быстрая параллельная сортировка.
- •29. Коммуникация трудоемкость параллельных алгоритмов. Характеристики обмена между всеми процессорами в сети в топологии «решетка-тор».
- •1.Оценка коммуникационной трудоемкости параллельных алгоритмов
- •1.1. Характеристики топологии сети передачи данных
- •1.2. Общая характеристика механизмов передачи данных Алгоритмы маршрутизации
- •1.3. Анализ трудоемкости основных операций передачи данных
- •Передача данных от всех процессоров всем процессорам сети
- •11.Паралельне програмування за технологією mpi. Операції з комунікаторами.
- •8.Паралельне програмування за технологією mpi. Процедури колективного обміну за схемою “усі-з усіма” без блокування.
11.Паралельне програмування за технологією mpi. Операції з комунікаторами.
Управління комунікаторами. Розглянемо управління комунікаторами, які використовуються для операцій передачі даних всередині однієї групи процесів.
Для створення нових комунікаторів існують два основних способи:
- дублювання вже наявного комунікатора:
int MPI_Comm_dup(MPI_Comm oldcom, MPI_comm *newcom),
де
- oldcom - наявний комунікатор, копія якого створбється;
- newcom - новий комунікатор;
- створення нового комунікатора з підмножини процесів наявного комунікатора:
int MPI_Comm_create(MPI_Comm oldcom, MPI_Group group,
MPI_Comm *newcomm) ,
де
- oldcom - наявний комунікатор;
- group - підмножина процесів комунікатора oldcom;
- newcom - новий комунікатор.
Дублювання комунікатора може застосовуватись, наприклад, для усунення можливості перетину по тегам повідомлень в різних частинах паралельної програми (в тому числі і при використанні функцій різних програмних бібліотек). Операція створення комунікаторів колективна, тобто повинна виконуватися всіма процесами вихідного комунікатора. Для пояснення розглянутих функцій можна навести приклад створення комунікатора, в якому містяться всі процеси, окрім процесу, що має ранг 0 в комунікаторі MPI_Comm_WORLD (такий комунікатор може бути корисним для підтримки схеми організації паралельних обчислень "менеджер-виконавці"):
MPI_Group WorldGroup, WorkerGroup;
MPI_Comm Workers;
int ranks[1];
ranks[0] = 0;
// Створення групи процесів в МРІ_COMM_WORLD
MPI_Comm_group(MPI_COMM_WORLD, &WorldGroup);
// Створення групи без процесіу з рангом 0
MPI_Group_excl(WorldGroup, 1, ranks, &WorkerGroup);
// Створення комунікатора по групі
MPI_Comm_create(MPI_COMM_WORLD, WorkerGroup, &Workers);
...
MPI_Group_Free(&WorkerGroup);
MPI_Comm_Free(&Workers);
Швидкий і корисний спосіб одночасного створення декількох комунікаторів забезпечує функція:
int MPI_Comm_split(MPI_Comm oldcom, int split, int key,
MPI_Comm *newcomm),
де
- nidcomm - вихідний комунікатор:
- split - номер комунікатора, якому повинен належати процес:
- key - порядок рангу процеса в створюваному комунікаторі;
- newcomm - створюваний комунікатор.
Створення
комунікатора відноситься до колективних
операцій, тому виклик функції MPI_Comm_split
повинен бути викликаний в кожному
процесі комунікатора oldcom.
В
результаті виконання функції процеси
розділяються на групи, що не перетинаються,
з однаковим значенням параметра split.
На основі сформованих груп створюється
набір комунікаторів. Для того, щоб
вказати, що процес не повинен входити
до жодного із створюваних комунікаторів,
слід скористатися константою MPI_UNDEFINDED
як значення параметра split.
При створенні комунікаторів для рангів
процесів в новому комунікаторі вибирається
такий порядок нумерації, щоб він
відповідав порядку значень параметрів
key
(процес з великим значенням параметра
key
отримує великий ранг, процеси з однаковим
значенням параметра key
зберігають свою відносну нумерацію).
Як приклад, розглянемо задачу зображення
набору процесів у вигляді двовимірної
решітки. Нехай
є загальна кількість процесів: подальший
наступний фрагмент програми забезпечує
отримання комунікаторів для кожної
стрічки створюваної топології:
MPI_Comm comm;
int rank, row;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
row = rank / q;
MPI_Comm_split(MPI_COMM_WORLD, row, rank, &comm);
За
умови виконання цього прикладу, наприклад,
коли
,
процеси з рангами (0, 1, 2) утворюють
перший комунікатор, процеси з рангами
(3, 4, 5) - другий і т.д. Після завершення
використання комунікатор повинен бути
видалений, для чого використовується
функція:
int MPI_Comm_free(MPI_Comm *comm),
де
- comm - комунікатор, який підлягає видаленню.