Message Passing Interface
|
|
Цю статтю потрібно вікіфікувати, щоб привести її вигляд до стандартів Вікіпедії. (листопад 2012) |
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» виводиться кожним процесом.
Див. також [ред.]
Примітки [ред.]
Посилання [ред.]
- MPI Forum and MPI specification
- Message Passing Interface, каталог посилань Open Directory Project
- Platform MPI
- Open MPI web site
- LAM/MPI web site
- MPICH
- SCore MPI
- MPI .NET
- NETCODE MPI Cluster
- MVAPICH: MPI over InfiniBand
- Parawiki page for MPI
- Global Arrays
- PVM/MPI Users' Group Meeting (2006 edition)
- MPI tutorials and other documents: [1], MPI Samples, Supercomputing Simplified, MPI Tutorial
- MPICH over Myrinet (GM, classic driver)
- MPICH over Myrinet (MX, next-gen driver)
- Parallel Programming with MatlabMPI
- MPI Toolbox for Octave (MPITB) Parallel Computing using GNU Octave
- Parallelize and distribute many optimization technics using MPI with ParadisEO
- MacMPI
- MPI over SCTP
- Dynamic Parallel Schedules (DPS) is an open source high-level framework in C++ on top of MPI
- IPython allows MPI applications to be steered interactively.
- Sample code for parallel computing on networked computers with load balancing and disaster recovery
- MPJ Express An Implementation of MPI-like bindings in Java
- mpiP is an open-source, lightweight, scalable MPI profiling tool.
- IBM Redbook: «RS/6000 SP: Practical MPI Programming»
| Це незавершена стаття про комп'ютери. Ви можете допомогти проекту, виправивши або дописавши її. |
|
||||||||||||||||||||||||||||||||
