
- •Хід роботи
- •Включення і настройка mpi відладника в ms vs
- •Програма 'π': паралельне інтегрування по формулі трапецій
- •Основні поняття mpi
- •Хід роботи
- •Завдання
- •Варіанти завдань
- •Хід роботи
- •Завдання
- •Контрольні питання
- •Лабораторна робота № 4 Тема. Організація паралельного множення матриць
- •Короткі теоретичні відомості
- •Хід роботи
- •Завдання
- •Контрольні запитання
- •Список літератури
Основні поняття mpi
MPI — це система передачі повідомлень. Вона була розроблена для підтримки широкого спектру апаратних засобів. Крім того, вона була спроектована для підтримки складної програмної архітектури з точною модульною структурою.
Ключове поняття MPI — комунікатор. При створенні набору процесів вони утворюють групу, яка може спільно використовувати середовище для зв'язку.
Група процесів у поєднанні з середовищем зв'язку утворює унікальний комунікатор. Переваги такої концепції стають очевидними, якщо розглянути використання бібліотек в програмі. Якщо програміст буде неуважний, повідомлення, створені розробником бібліотеки, можуть конфліктувати з повідомленнями, які використовуються в програмі, що викликає цю бібліотеку. Але за наявності комунікаторів розробник бібліотеки може створити власне середовище зв'язку і при цьому гарантувати, що поки мова йде про повідомлення, що передаються в системі, все, що відбувається в бібліотеці, не вийде за її межі.
При запуску MPI-програми створюється комунікатор за замовчанням, MPI_COMM_WORLD, який передається кожній MPI-підпрограмі як перший аргумент. Решту аргументів визначають джерело повідомлення і буфери для зберігання повідомлень. MPI-підпрограми повертають цілочисельне значення як параметр помилки, що дозволяє дізнатись про будь-які проблеми, що мали місце при виконанні підпрограми.
Зазвичай де-небудь на початку MPI-програми виконується виклик трьох підпрограм для настройки застосування MPI.
int my_id, numprocs;
MPI_Init(&argc, &argv) ;
MPI_Comm_Rank(MPI_COMM_WORLD, &my_id) ;
MPI_Comm_Size(MPI_COMM_WORLD, &numprocs) ;
Перша підпрограма (MPI_Init) приймає як вхідні параметри аргументи командного рядка, знайомі кожному програмістові C, і ініціалізує середовище MPI. Дві наступні підпрограми приймають як вхідний параметр ім'я MPI-комунікатора (в даному випадку це комунікатор за замовчанням) і повертають ранг викликаючого процесу і загальне число процесів. Ранг використовується як унікальний ідентифікатор процесу. Його значення може знаходитись у межах від нуля до числа процесів мінус один.
Інформація про те, скільки процесів створено і на яких процесорах вони працюють, є зовнішньою по відношенню до API-интерфейсу MPI. Залежно від того, яка платформа підтримує MPI, використовуються різні методи. В більшості випадків це файл головної машини, в якому всі процесори перераховані по іменам. Він передається стандартному сценарію оболонки під назвою mpirun, який є на більшості MPI-платформ, для запуску MPI-програми.
В кінці кожної MPI-програми повинна бути присутньою підпрограма, що закриває середовище. Ця функція повертає цілочисельне значення, що є кодом помилки.
int MPI_Finalize();
Між цими підпрограмами і розташовується робоча частина MPI-програми. Велика частина програми є звичайним послідовним кодом, мову якого програміст вибирає сам. Хоча всі процеси виконують однаковий код, поведінка програми розрізняється залежно від рангу процесу. У тих точках, де потрібний зв'язок або інша взаємодія між процесами, вставляються MPI-підпрограми.
Розглянемо функцію для виконання редукції і повернення кінцевого результату одному з процесів у групі.
int MPI_Reduce(void* sendbuf, void* recvbuf,
int count, MPI_Datatype datatype, MPI_OP op,
int root, MPI_COMM comm.)
Ця функція приймає "count" значень типу "datatype" в буфері "sendbuf", збирає результати від кожного процесу за допомогою операції "op", а потім поміщає результат в буфер "recvbuf" процесів рангу "root". MPI_Datatype і MPI_OP приймають інтуїтивно зрозумілі значення, такі як "MPI_DOUBLE" або "MPI_SUM".
Інші часто використовувані в MPI підпрограми служать для широкомовної передачі повідомлення (MPI_Bcast), визначення бар'єрних точок синхронізації (MPI_Barrier), відправки (MPI_Send) або отримання (MPI_Recv) повідомлення.