Message Passing Interface

Сюди перенаправляється запит " OpenMPI ". На цю тему потрібна окрема стаття .

Message Passing Interface (MPI, інтерфейс передачі повідомлень) - програмний інтерфейс ( API) для передачі інформації, який дозволяє обмінюватися повідомленнями між процесами, що виконують одну задачу. Розроблений Уїльямом Гроуппом, Евін ласки (англ.) та іншими.

MPI є найбільш поширеним стандартом інтерфейсу обміну даними в паралельному програмуванні, існують його реалізації для великого числа комп'ютерних платформ. Використовується при розробці програм для кластерів і суперкомп'ютерів. Основним засобом комунікації між процесами в MPI є передача повідомлень один одному. Стандартизацією MPI займається MPI Forum. У стандарті MPI описаний інтерфейс передачі повідомлень, який повинен підтримуватися як на платформі, так і в додатках користувача. В даний час існує велика кількість безкоштовних і комерційних реалізацій MPI. Існують реалізації для мов Фортран 77/90, Java, Сі і Сі + +.

В першу чергу MPI орієнтований на системи з розподіленою пам'яттю, тобто коли витрати на передачу даних великі, в той час як OpenMP орієнтований на системи з загальною пам'яттю (багатоядерні із загальним кешем). Обидві технології можуть використовуватися спільно, щоб оптимально використовувати в кластері багатоядерні системи.


1. Стандарти MPI

Перша версія MPI розроблялася в 1993-1994 році, і MPI 1 вийшла в 1994.

Більшість сучасних реалізацій MPI підтримують версію 1.1. Стандарт MPI версії 2.0 підтримується більшістю сучасних реалізацій, але деякі функції можуть бути реалізовані не до кінця.

У MPI 1.1 (опублікований 12 червня 1995, перша реалізація з'явилася в 2002 році) підтримуються наступні функції:

  • передача та отримання повідомлень між окремими процесами;
  • колективні взаємодії процесів;
  • взаємодії в групах процесів;
  • реалізація топологій процесів;

У MPI 2.0 (опублікований 18 липня 1997) додатково підтримуються наступні функції:

  • динамічне породження процесів і керування процесами;
  • односторонні комунікації (Get / Put);
  • паралельний введення і виведення;
  • розширені колективні операції (процеси можуть виконувати колективні операції не тільки всередині одного комунікатора, але й в рамках декількох комунікаторів).

Версія MPI 2.1 вийшла на початку вересня 2008 року.

Версія MPI 2.2 вийшли 4 вересня 2009 року.

Версія MPI 3.0 вийшла 21 вересня 2012 року.


2. Функціонування інтерфейсу

Базовим механізмом зв'язку між MPI процесами є передача і прийом повідомлень. Повідомлення несе в собі передані дані і інформацію, що дозволяє приймаючій стороні здійснювати їх вибірковий прийом:

  • відправник - ранг (номер в групі) відправника повідомлення;
  • одержувач - ранг одержувача;
  • ознака - може використовуватися для поділу різних видів повідомлень;
  • комунікатор - код групи процесів.

Операції прийому і передачі можуть бути блокується і не блокує. Для не блокуються операцій визначені функції перевірки готовності та очікування виконання операції.

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


3. Приклад програми

Нижче наведено приклад програми обчислення числа π на мові C з використанням MPI:

 / / Підключення необхідних заголовків  # Include   # Include   / / Підключення заголовного файлу MPI  # Include "mpi.h"  / / Функція для проміжних обчислень  double  f  (  double  a  )  {  return  (  4.0  /  (  1.0  +  a  *  a  )  )  ;  }  / / Головна функція програми  int  main  (  int  argc  ,  char  **  argv  )  {  / / Оголошення змінних  int  done  =  0  ,  n  ,  myid  ,  numprocs  ,  i  ;  double  PI25DT  =  3.141592653589793238462643  ;  double  mypi  ,  pi  ,  h  ,  sum  ,  x  ;  double  startwtime  =  0.0  ,  endwtime  ;  int  namelen  ;  char  processor_name  [  MPI_MAX_PROCESSOR_NAME  ]  ;  / / Ініціалізація підсистеми MPI  MPI_Init  (  &  argc  ,  &  argv  )  ;  / / Отримати розмір комунікатора MPI_COMM_WORLD  / / (Загальне число процесів в рамках задачі)  MPI_Comm_size  (  MPI_COMM_WORLD  , &  numprocs  )  ;  / / Отримати номер поточного процесу в рамках  / / Комунікатора MPI_COMM_WORLD  MPI_Comm_rank  (  MPI_COMM_WORLD  , &  myid  )  ;  MPI_Get_processor_name  (  processor_name  , &  namelen  )  ;  / / Вивід номери потоку в загальному пулі  fprintf  (  stdout  ,  "Process% d of% d is on% s  \ N  "  ,  myid  ,  numprocs  ,  processor_name  )  ;  fflush  (  stdout  )  ;  while  (  !  done  )  {  / / Кількість інтервалів  if  (  myid  ==  0  )  {  fprintf  (  stdout  ,  "Enter the number of intervals: (0 quits)"  )  ;  fflush  (  stdout  )  ;  if  (  scanf  (  "% D"  , &  n  )  ! =  1  )  {  fprintf  (  stdout  ,  "No number entered; quitting  \ N  "  )  ;  n  =  0  ;  }  startwtime  =  MPI_Wtime  (  )  ;  }  / / Розсилка кількості інтервалів всім процесам (в тому числі і собі)  MPI_Bcast  (  &  n  ,  1  ,  MPI_INT  ,  0  ,  MPI_COMM_WORLD  )  ;  if  (  n  ==  0  )  done  =  1  ;  else  {  h  =  1.0  /  (  double  )  n  ;  sum  =  0.0  ;  / / Обраховування точки, закріпленої за процесом  for  (  i  =  myid  +  1  ;  (  i  <=  n  )  ;  i  + =  numprocs  )  {  x  =  h  *  (  (  double  )  i  -  0.5  )  ;  sum  + =  f  (  x  )  ;  }  mypi  =  h  *  sum  ;  / / Скидання результатів з усіх процесів і додавання  MPI_Reduce  (  &  mypi  ,  &  pi  ,  1  ,  MPI_DOUBLE  ,  MPI_SUM  ,  0  ,  MPI_COMM_WORLD  )  ;  / / Якщо це головний процес, висновок отриманого результату  if  (  myid  ==  0  )  {  printf  (  "PI is approximately% .16 f, Error is% .16 f  \ N  "  ,  pi  ,  fabs  (  pi  -  PI25DT  )  )  ;  endwtime  =  MPI_Wtime  (  )  ;  printf  (  "Wall clock time =% f  \ N  "  ,  endwtime  -  startwtime  )  ;  fflush  (  stdout  )  ;  }  }  }  / / Звільнення підсистеми MPI  MPI_Finalize  (  )  ;  return  0  ;  } 

4. Реалізації MPI

  • MPICH - найпоширеніша безкоштовна реалізація, працює на UNIX -системах і Windows NT
  • LAM / MPI - ще одна безкоштовна реалізація MPI. Підтримує гетерогенні конфігурації, LAM (http://www.lam-mpi.org) підтримує гетерогенні конфігурації, пакет Globus і задовольняє IMPI (Interoperable MPI).

Підтримуються різні комунікаційні системи (у тому числі Myrinet).

  • WMPI - реалізація MPI для Windows
  • MPI / PRO For Windows NT - комерційна реалізація для Windows NT
  • Intel MPI - комерційна реалізація для Windows / Linux
  • Microsoft MPI входить до складу Compute Cluster Pack SDK. Заснований на MPICH2, але включає додаткові засоби управління завданнями. Підтримується специфікація MPI-2.
  • HP-MPI - комерційна реалізація від HP
  • SGI MPT - платна бібліотека MPI від SGI
  • Mvapich - безкоштовна реалізація MPI для Infiniband
  • Open MPI - безкоштовна реалізація MPI, спадкоємець LAM / MPI
  • Oracle HPC ClusterTools - безкоштовна реалізація для Solaris SPARC / x86 і Linux на основі Open MPI
  • MPJ - MPI for Java
  • MPJ Express - MPI на Java