Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПтаРО экзамен.docx
Скачиваний:
22
Добавлен:
26.03.2015
Размер:
85.76 Кб
Скачать

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