Чтобы было понятно, MPI — это структурированная коммуникационная библиотека, а не какое-то эзотерическое расширение языка параллельного программирования. Он просто упрощает структурированный обмен данными между сущностями, называемыми рангами. Как правило, ранги — это процессы, работающие на одном компьютере или на разных компьютерах, связанных какой-либо сетью, но это также могут быть и другие взаимодействующие сущности. Важно то, что каждый ранг сам по себе, когда дело доходит до выполнения кода, и ему все равно, где в программе находятся другие ранги. Более того, ему все равно, работают ли другие ранги по той же программе. На самом деле, хотя для MPI характерно, что все ранги запускают один и тот же код, так называемая SPMD или Sодна программаM ultiple Data, вы можете написать отдельную программу для группы рангов или даже для каждого ранга, что известно как MPMD или Mmultiple P< /strong>программирует многонесколько данных. MPI даже упрощает классический режим клиент-сервер и позволяет соединяться отдельным заданиям MPI. SPMD просто легче программировать, так как вам нужно написать только одну программу.
Думайте о MPI просто как о посреднике (промежуточном программном обеспечении) между вашим кодом и специфичными для системы API, который обеспечивает простое взаимодействие между процессами и абстрагируется от таких вещей, как определение фактических конечных точек других партнеров по общению (например, определение сетевых адресов и номеров портов). когда связь осуществляется через TCP/IP). Когда вы пишете браузер, который связывается по сети с веб-сервером, вам все равно, какой код выполняет сервер. И наоборот, серверу все равно, какой код выполняет ваш браузер. Пока оба используют один и тот же протокол, связь работает. То же самое относится и к MPI — пока два ранга используют одну и ту же библиотеку MPI, они могут взаимодействовать.
Для успешной связи в MPI необходимы только две вещи (при типичном обмене данными точка-точка):
- отправитель: ранг А желает отправить данные рангу Б, поэтому он вызывает
MPI_Send(..., B, tag, MPI_COMM_SOMETHING);
- получатель: ранг B желает получать данные от ранга A, поэтому он вызывает
MPI_Recv(..., A, tag, MPI_COMM_SOMETHING, ...);
Пока оба ранга указывают один и тот же тег и коммуникатор, а адреса в вызовах отправки и приема совпадают попарно (включая возможность получателя указывать подстановочные знаки источника и тега), обмен будет происходить независимо от того, где находятся фактические строки кода. расположена.
Ниже приведен совершенно правильный пример MPI:
rank_0.c
#include <stdio.h>
#include <mpi.h>
int main(void)
{
MPI_Init(NULL, NULL);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int a;
MPI_Recv(&a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("Rank %d got %d from rank 1\n", rank, a);
MPI_Finalize();
return 0;
}
rank_1.c
#include <mpi.h>
#include <stdio.h>
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int a = 42;
MPI_Send(&a, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
printf("Rank %d sent %d to rank 0\n", rank, a);
MPI_Finalize();
return 0;
}
Скомпилируйте и запустите:
$ mpicc -o rank_0 rank_0.c
$ mpicc -o rank_1 rank_1.c
$ mpiexec -n 1 ./rank_0 : -n 1 ./rank_1
Rank 0 got 42 from rank 1
Rank 1 sent 42 to rank 0
Как видите, это две совершенно разные программы, и они по-прежнему успешно работают вместе в одном задании MPI и могут обмениваться сообщениями.
person
Hristo Iliev
schedule
05.05.2020
MPI_Finalize()
- person Gilles Gouaillardet   schedule 04.05.2020