38 lines
1.8 KiB
Python
38 lines
1.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Демо: привет, MPI — ранги, размер мира, точка-точка.
|
|
|
|
Запуск из корня курса:
|
|
mpiexec -n 4 python lab08_mpi/examples/01_hello_mpi.py
|
|
|
|
Каждый ранг — отдельный процесс с копией программы. Ранги обмениваются
|
|
сообщениями: ранг 0 рассылает своё имя всем, каждый отвечает.
|
|
Без mpiexec (обычный python) программа работает как единственный ранг.
|
|
"""
|
|
from mpi4py import MPI
|
|
|
|
comm = MPI.COMM_WORLD
|
|
rank = comm.Get_rank()
|
|
size = comm.Get_size()
|
|
|
|
print(f"[до обмена] ранг {rank} из {size}, узел {MPI.Get_processor_name()}")
|
|
|
|
if rank == 0:
|
|
# ранг 0 рассылает задание всем остальным (bcast: всем одно и то же)
|
|
greeting = f"привет от координатора (ранг 0), всего рангов {size}"
|
|
else:
|
|
greeting = None
|
|
|
|
greeting = comm.bcast(greeting, root=0) # коллективная: вызывают ВСЕ
|
|
print(f"ранг {rank}: получил «{greeting}»")
|
|
|
|
# точка-точка: каждый ранг (кроме 0) отправляет 0 свой номер
|
|
if rank != 0:
|
|
comm.send(rank, dest=0, tag=11)
|
|
print(f"ранг {rank}: отправил свой номер координатору")
|
|
else:
|
|
received = [comm.recv(source=r, tag=11) for r in range(1, size)]
|
|
print(f"ранг 0: получил номера от рангов {received}")
|
|
|
|
if size == 1:
|
|
print("\nВы запустили без mpiexec — работает один ранг.")
|
|
print("Попробуйте: mpiexec -n 4 python lab08_mpi/examples/01_hello_mpi.py") |