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

наявність засобів візуалізації продуктивності паралельних програм (upshot і jumpshot);

наявність у складі MPICH тестів продуктивності і перевірки функціонування системи.

Недоліки MPICH – неможливість запуску процесів під час роботи програми і відсутність засобів моніторингу за поточним станом системи.

До складу MPICH входять бібліотечні і заголовні файли, що реалізують біля сотні підпрограм. Ми будемо розглядати реалізацію MPICH.NT 1.2.4 для Windows NT.


3. MPI у прикладах

3.1 Найпростіша MPI-програма

Ми почнемо наше знайомство з MPI з вивчення найпростішої програми:

===== Example1.cpp =====

#include <mpi.h> // очевидно;)

#include <stdio.h>

int main(int argc, char* argv[])

{

int myrank, size;

MPI_Init(&argc,&argv); // Ініціалізація MPI

MPI_Comm_size(MPI_COMM_WORLD,&size); // Розмір комунікатора

MPI_Comm_rank(MPI_COMM_WORLD,&myrank); // Одержуємо наш номер

printf("Proc %d of %d\n",myrank,size);

MPI_Finalize(); // Фіналізація MPI

puts ("Done.");

return 0;

}

===== Example1.cpp =====

Перед викликом будь-якої процедури MPI, потрібно викликати ініціалізацію MPI_Init, перед цим викликом може знаходитися тільки виклик MPI_Initialized, призначення якого очевидно. MPI_Init крім усього іншого створює глобальний комунікатор MPI_COMM_WORLD, через которий буде проходити обмін повідомленнями. Область взаємодії комунікатора MPI_COMM_WORLD – усі процеси даної програми. Якщо є необхідність у розбивці області взаємодії на більш дрібні сегменти (частково-широкомовні розсилання), використовуються виклики MPI_Comm_dup/create/split/etc (тут не розглядаються). Розмір комунікатора, одержуваний викликом MPI_Comm_size – число процесів у ньому. Розмір комунікатора MPI_COMM_WORLD – загальне число процесів. Кожен процес має свій унікальний (у рамках комунікатора!) номер – ранг. Ранги процесів у контекстах різних комунікаторів можуть розрізнятися. Після виконання всіх обмінів повідомленнями в програмі повинний розташовуватися виклик MPI_Finalize() – процедура видаляє всі структури даних MPI і робить інші необхідні дії. Програміст повинний сам подбати про те, щоб до моменту виклику MPI_Finalize усі пересилання даних були довершені. Після виконання MPI_Finalize виклик будь-яких, крім MPI_Initialized, процедур (навіть MPI_Init!) неможливий. MPI_Initialized у даному випадку буде показувати, визивал-ли процес MPI_Init. Отже, уже стало ясно, що наша програма виводить повідомлення від усіх породжених нею процесів. Приклад висновку (порядок повідомлень, що надходять від процесів, може і буде мінятися) приведений нижче (np - кількість процесів):

Example1 output (np = 3):

Proc 1 of 3

Done.

Proc 0 of 3

Done.

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