Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод АТПО лр.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
561.15 Кб
Скачать

Основні поняття 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) повідомлення.