Українська
Підсумки
Висновки
MPI – стандарт передавання повідомлень для систем із розподіленою пам’яттю: процеси з однією програмою (модель SPMD) мають власну пам’ять і розрізняються рангами в комунікаторі. Open MPI 5.0 з пакетів Ubuntu надає обгортки mpicxx, засіб запуску mpirun і ціль CMake MPI::MPI_CXX. Двоточкові операції MPI_Send/MPI_Recv передають повідомлення з тегом; стандартне відправлення може чекати на отримувача, тому обмін, у якому всі спочатку відправляють, призводить до взаємоблокування – його усувають MPI_Sendrecv або неблокуючі MPI_Isend/MPI_Irecv з MPI_Waitall. Колективні операції (MPI_Bcast, MPI_Scatter(v), MPI_Gather(v), MPI_Reduce, MPI_Allreduce) викликають усі процеси комунікатора. Похідні типи описують структури й стовпці, MPI_Comm_split створює групи процесів, а декартові топології спрощують декомпозицію області з обміном гало. Гібридні програми поєднують MPI між процесами з OpenMP усередині процесу (MPI_Init_thread, MPI_THREAD_FUNNELED) і потребують правильної прив’язки (--map-by slot:PE=…, --report-bindings). Продуктивність оцінюють моделлю α–β та вимірюваннями сильної й слабкої масштабованості; задачі, обмежені пропускною здатністю пам’яті, на одному комп’ютері майже не прискорюються, а на кластері кожен вузол додає власну пам’ять.
Питання для самоперевірки
- Чим модель розподіленої пам’яті відрізняється від моделі спільної пам’яті?
- Що таке SPMD, ранг і комунікатор? Що таке
MPI_COMM_WORLD? - Які версії стандарту MPI існують? Чим відрізняються стандарт і реалізація?
- Як зібрати програму MPI обгорткою
mpicxxі в проєкті CMake? - Що таке слот у
mpirun? Як запустити більше процесів, ніж ядер? - З чого складається повідомлення MPI? Для чого теги,
MPI_ANY_SOURCEіMPI_Status? - Чим відрізняються режими
MPI_Send,MPI_Ssend,MPI_BsendіMPI_Rsend? - Чому обмін «усі відправляють, потім приймають» може працювати на малих даних і зависати на великих?
- Як працюють
MPI_Isend,MPI_Irecv,MPI_WaitіMPI_Test? Що таке перекриття обчислень і комунікацій? - Які колективні операції ви знаєте? Чим
MPI_Reduceвідрізняється відMPI_Allreduce, аMPI_ScatterвідMPI_Scatterv? - Які правила виклику колективних операцій?
- Для чого потрібні похідні типи? Як описати структуру та стовпець матриці?
- Як створити декартову топологію й знайти сусідів процесу? Що таке гало?
- Які рівні підтримки потоків визначає MPI? Навіщо
MPI_Init_thread? - Як розмістити ранги гібридної програми на ядрах і перевірити прив’язку?
- Що потрібно для запуску MPI-програми на кількох комп’ютерах?
- Що описує модель α–β? Як виміряти затримку й пропускну здатність?
- Чим сильна масштабованість відрізняється від слабкої?
Корисні посилання
- Стандарти MPI Forum: https://www.mpi-forum.org/docs/
- Документація Open MPI: https://docs.open-mpi.org/
- Запуск програм в Open MPI 5.0: https://docs.open-mpi.org/en/v5.0.x/launching-apps/index.html
- Сторінка довідки
mpirun: https://docs.open-mpi.org/en/v5.0.x/man-openmpi/man1/mpirun.1.html - Запуск через SSH: https://docs.open-mpi.org/en/v5.0.x/launching-apps/ssh.html
- Модуль CMake FindMPI: https://cmake.org/cmake/help/latest/module/FindMPI.html
- MPICH: https://www.mpich.org/documentation/guides/
- Проєкти Open MPI у CLion: https://www.jetbrains.com/help/clion/openmpi.html