Message Passing Interface

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

MPI (англ. Message Passing Interface, Інтерфейс передачі повідомлень) — це специфікація, що була розроблена в 1993–1994 роках групою MPI Forum[1],і забезпечує реалізацію моделі обміну повідомленнями між процесами. Остання версія даної специфікації: MPI-2. У моделі програмування MPI програма породжує кілька процесів, що взаємодіють між собою за допомогою звертання до підпрограм прийому і передачі повідомлень.

Зазвичай, при ініціалізації MPI-програми створюється фіксований набір процесів, причому (що, утім, необов'язково) кожний з них виконується на своєму процесорі. У цих процесах можуть виконуватися різні програми, тому MPI-модель іноді називають MPMD-моделлю (Multiple Program, Multiple Data), на відміну від SPMD моделі, де на кожному процесорі виконуються тільки однакові задачі. MPI підтримує двохточкові і глобальні, синхронні й асинхронні, блокуючі і неблокуючі типи комунікацій. Спеціальний механізм — комунікатор — ховає від програміста внутрішні комунікаційні структури. Структура комунікацій може змінюватися протягом часу життя процесу, але кількість задач повинна залишатися постійною (MPI-2 уже підтримує динамічну зміну числа задач).

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

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

MPI-програма[ред.ред. код]

#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;
}

Перед викликом будь-якої процедури 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) неможливий. Наша програма виводить повідомлення від усіх породжених нею процесів. Приклад виводу (порядок повідомлень, що надходять від процесів, може буде змінюватися) приведений нижче (np — кількість процесів):

  Proc 1 of 3
  Done.
  Proc 0 of 3
  Done.
  Proc 2 of 3
  Done.

Зверніть увагу, що після виклику MPI_Finalize() парелельна робота не закінчується — «Done» виводиться кожним процесом.

Див. також[ред.ред. код]

Примітки[ред.ред. код]

Посилання[ред.ред. код]


Комп'ютер Це незавершена стаття про комп'ютери.
Ви можете допомогти проекту, виправивши або дописавши її.