Паралельне програмування за технологією MPI . Операції з комунікаторами. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Паралельне програмування за технологією 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 - комунікатор, який підлягає видаленню.



Поделиться:


Последнее изменение этой страницы: 2020-10-24; просмотров: 145; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.246.193 (0.006 с.)