Контрольная работа: Паралельні обчислення з використанням MPI

int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)

Її параметри одночасно є вхідними і вихідними:

buffer — адреса буфера;

count — кількість елементів даних у повідомленні;

datatype — тип даних MPI;

root — ранг головного процесу, що виконує широкомовне розсилання;

comm — комунікатор.

Обмін із синхронізацією

Синхронізація за допомогою "бар'єра" є найпростішою формою синхронізації колективних обмінів. Вона не вимагає пересилання даних. Підпрограма MPI_Barrier блокуючий виконання кожного процесу з комунікатора comm доти, поки всі процеси не викликають цю підпрограму: int MPI_Barrier(MPI_Comm comm)

Розподіл і збір даних

Розподіл і збір даних виконуються за допомогою підпрограм MPI_Scatter і MPI_Gather відповідно. Список аргументів в обох підпрограм однаковий, але діють вони по-різному.

Схеми передачі даних для операцій збору і розподілу даних приведені на малюнках.

Повний список підпрограм розподілу і збору даний приведений у таблиці:

Підпрограма Короткий опис
MPI_Allgather Збирає дані від усіх процесів і пересилає їх усім процесам
MPI_Allgatherv

Збирає дані від усіх процесів і пересилає їх усім процесам ("векторний" варіант підпрограми

MPI_Allgather)

MPI_Allreduce Збирає дані від усіх процесів, виконує операцію приведення, і результат розподіляє всім процесам
MPI_Alltoall Пересилає дані від усіх процесів усім процесам
MPI_Alltoallv Пересилає дані від усіх процесів усім процесам ("векторний" варіант підпрограми MPI_Alltoall)
MPI_Gather Збирає дані від групи процесів
MPI_Gatherv Збирає дані від групи процесів ("векторний" варіант підпрограми MPI Gather)
MPI_Reduce Виконує операцію приведення, тобто обчислення єдинного значення по масиву вихідних даних
MPI_Reduce_scatter Збір значень з наступним розподілом результата операції приведення
MPI_Scan Виконання операції сканування (часткова редукція) для даних від групи процесів
MPI_Scatter Розподіляє дані від одного процесу всім іншим процесам у групі
MPI_Scatterv Пересилає буфер вроздріб усім процесам у групі ("векторний" варіант підпрограми MPI_Scatter)

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

int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *rcvbuf, int rcvcount, MPI_Datatype rcvtype, int root, MPI_Comm comm)

Її вхідні параметри (параметри підрограми MPI_Gather такі ж):

sendbuf – адреса буфера передачі;

sendcount – кількість елементів, що пересилаються кожному процесу (але не сумарна кількість елементів, що пересилаються,);

sendtype – тип переданих даних;

rcvcount – кількість елементів у буфері прийому;

rcvtype – тип прийнятих даних;

root – ранг передавального процесу;

comm – комунікатор.

Вихідний параметр rcvbuf – адреса буфера прийому. Працює ця підпрограма в такий спосіб. Процес з рангом root ("головний процес") розподіляє вміст буфера передачі sendbuf серед усіх процесів. Уміст буфера передачі розбивається на кілька фрагментів, кожний з який містить sendcount елементів. Перший фрагмент передається процесу 0, другий процесу 1 і т.д. Аргументи send мають значення тільки на стороні процесу root.

При зборці (MPI_Gather) кожен процес у комунікаторі comm пересилає вміст буфера передачі sendbuf процесу з рангом root. Процес root "склеює" отримані дані в буфері прийому. Порядок склейки визначається рангами процесів, тобто в результуючому наборі після даних від процесу 0 випливають дані від процесу 1, потім дані від процесу 2 і т.д. Аргументи rcvbuf, rcvcount і rcvtype відіграють роль тільки на стороні головного процесу. Аргумент rcvcount указує кількість елементів даних, отриманих від кожного процесу (але не їхня сумарна кількість). При виклику підпрограм MPI_scatter і MPI_Gather з різних процесів варто використовувати загальний головний процес.

Операції приведення і сканування

К-во Просмотров: 409
Бесплатно скачать Контрольная работа: Паралельні обчислення з використанням MPI