на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Паралельні обчислення з використанням MPI
p align="left">MPI_Recv (&k, 1, MPI_INT, x, TAG_REPLY, MPI_COMM_WORLD, &status);

printf("Reply from proc %d received %d\n",x,k); fflush(stdout);

x++;

}

puts("Running procs backwards"); fflush(stdout);

x=size-1;

while (x >0)

{

MPI_Send(&x,1, MPI_INT, x, TAG_SEND_BACK, MPI_COMM_WORLD);

x--;

}

else // інші процеси - підлеглі

{

MPI_Recv(&k, 1, MPI_INT, 0, TAG_SEND_FWD, MPI_COMM_WORLD, &status);

printf("Proc %d received %d\n",myrank,k); fflush(stdout);

MPI_Ssend(&k,1, MPI_INT, 0, TAG_REPLY, MPI_COMM_WORLD);

MPI_Recv(&k, 1, MPI_INT, 0, TAG_SEND_BACK, MPI_COMM_WORLD, &status);

printf("Proc %d Received %d\n",myrank,k); fflush(stdout);

}

MPI_Finalize();

return 0;

}

===== Example2.cpp =====

У цьому прикладі один із процесів (з рангом 0) розсилає повідомлення іншому у прямому, а потім у зворотному порядку.

Прототип функції: int MPI_[..]Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm).

Вхідні параметри (однакові для усіх функцій *send):

buf - адреса першого елемента в буфері передачі

count - кількість елементів у буфері передачі

Тип даних MPI

Тип даних З

MPI_CHAR

signed char

MPI_SHORT

signed short int

MPI_INT

signed int

MPI_LONG

signed long int

MPI_UNSIGNED_CHAR

unsigned char

MPI_UNSIGNED_SHORT

unsigned short int

MPI_UNSIGNED

unsigned int

MPI_UNSIGNED_LONG

unsigned long int

MPI_FLOAT

float

MPI_DOUBLE

double

MPI_LONG_DOUBLE

long double

MPI_BYTE

Ні відповідності

MPI_PACKED

Ні відповідності

datatype - тип MPI кожного переданого елемента. MPI визначає власні типи даних, схожі на типи даних C, однак, існують і унікальні для MPI типи (див. таблицю відповідності). У MPI повинні дотримуватися правила сумісності типів, з базових типів можуть бути сконструйовані більш складні.

dest - ранг процесу-одержувача повідомлення. Ранг тут - ціле число від 1 до n-1, де n - число процесів в області взаємодії

tag - тег - унікальний ідентифікатор повідомлення

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

Стандартна передача, що блокуючий, починається незалежно від того, чи був зареєстрований відповідний прийом, а завершується тільки після того, як повідомлення прийняте системою і процес-джерело може знову використовувати буфер передачі. Повідомлення може бути скопійоване прямо в буфер прийому, а може бути поміщене в тимчасовий системний буфер, де і буде чекати виклику адресатом підпрограми прийому. У цьому випадку говорять про буферизації повідомлення. Передача може завершитися ще до виклику відповідної операції прийому. З іншого боку, буфер може бути недоступний чи MPI може вирішити не буферизувати вихідні повідомлення з міркувань збереження високої продуктивності. У цьому випадку передача завершиться тільки після того, як буде зареєстровані відповідний прийом і дані будуть передані адресату.

Прийом виконується підпрограмою:

int MPI_Recv (void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status * status)

Її вхідні параметри (у MPI_Irecv - такі ж):

count - максимальна кількість елементів у буфері прийому. Фактична їхня кількість можна визначити за допомогою підпрограми MPI_Get_count;

datatype - тип прийнятих даних. Нагадаємо про необхідність дотримання відповідності типів аргументів підпрограм прийому і передачі;

source - ранг джерела. Можна використовувати спеціальне значення mpi_any_source, що відповідає довільному значенню рангу. У програмуванні ідентифікатор, що відповідає довільному значенню параметра, часто називають "джокером". Цей термін будемо використовувати і ми;

tag - тег чи повідомлення "джокер" mpi_any_tag, що відповідає довільному значенню тега;

comm -- комунікатор. При вказівці комунікатора "джокери" використовувати не можна.

Варто мати на увазі, що при використанні значень mpi_any_source (будь-яке джерело) і mpi_any_tag (будь-який тег) є небезпеку прийому повідомлення, не призначеного даному процесу.

Вихідними параметрами є:

buf - початкова адреса буфера прийому. Його розмір повинний бути достатнім, щоб розмістити прийняте повідомлення, інакше при виконанні прийому відбудеться збій - виникне помилка переповнення;

status - статус обміну - спеціальна структура MPI.

Якщо повідомлення менше, ніж буфер прийому, змінюється вміст лише тих комірок пам'яті буфера, що відносяться до повідомлення. Інформація про довжину прийнятого повідомлення міститься в одному з полів статусу, але до цієї інформації в програміста немає прямого доступу (як до поля рядка чи елементу масиву). Розмір отриманого повідомлення (count) можна визначити за допомогою виклику підпрограми MPI_Get_count:

int MPI_Get_count (MPI_Status *status, MPI_Datatype datatype, int *count)

Аргумент datatype повинний відповідати типу даних, зазначеному в операції обміну.

Висновок Example2 output(np = 6): Ssend & replies

Running procs forwards

Proc 1 received 1

Reply from proc 1 received 1

Proc 2 received 2

Reply from proc 2 received 2

Proc 3 received 3

Reply from proc 3 received 3

Proc 4 received 4

Reply from proc 4 received 4

Proc 5 received 5

Reply from proc 5 received 5

Running procs backwards

Proc 5 Received 5

Proc 4 Received 4

Proc 3 Received 3

Proc 2 Received 2

Proc 1 Received 1

Завдання 1: Проаналізуйте висновок приклада. Спробуйте забрати зворотні повідомлення (replies), що зміниться? Застосуєте різні сполучення *send (Send,Ssend,Rsend) і прокоментуйте відповідні висновки програм.

Завдання 2: Зміните топологію пересилання повідомлень у Прикладі 2 з «зірки» на «кільце» (див. мал.). Проробіть усі те ж, що й у Завданні 1.

3.3 Колективний обмін даними.

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

У будь-якому колективному обміні бере участь кожен процес з деякої області взаємодії. Можна організувати обмін і в підмножині процесів, для цього маються засоби створення нових областей взаємодії і відповідних їм комунікаторів. Колективні обміни характеризуються наступним:

колективні обміни не можуть взаємодіяти з двохточковими. Колективна передача, наприклад, не може бути перехоплена двохточковой підпрограмою прийому;

колективні обміни можуть виконуватися як із синхронізацією, так і без її;

усі колективні обміни є блокирующими для їхній обменаЭЪ, що ініціював;

теги повідомлень призначаються системою.

Широкомовне розсилання

Широкомовне розсилання виконується одним виділеним процесом, що називається головним (root), а всі інші процеси, що приймають участь в обміні, одержують по одній копії повідомлення від головного процесу:

Виконується широкомовне розсилання за допомогою підпрограми

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 - кількість елементів у буфері прийому;

Страницы: 1, 2, 3, 4



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.