В случае коллективных взаимодействий и взаимодействий
Point_to_point
(gather,Scatter,
Bcast,Reduse)
Связи между отдельными процессами не очевидны. Сделать их более явными позволяют виртуальные топологии, которые ставят в соответствие рангу процесса его виртуальные координаты.
Различают два вида топологии: 1)декартовые топологии 2)топологии графа
Размерности устанавливаются так, чтобы быть как можно ближе друг к другу в соотношении со специальным алгоритмом. Если в элементе мало, большее, то функция не будет модулировать количество узлов в измерении i.
Int MPI_cart_coords (MPI_comm comm,
Int rank,
Int maxdims,
Int x cords);
Отображение обратное по отношению к MPI_cart_rank
Функция вычисляет координаты данного процесса в текущей топологии по его рангу.
Аргументы:comm –коммуникатор с декартовой топологией, rank – ранг процесса, maxdims – количество измерений в топологии, cords – массив координат в процессах.
Функция смещения, определяет ранг процесса, смежному данному в заданной топологии.
int MPI_Cart_create (MPI_Comm comm_old, int ndims, int *dims, int *periods, int reorder, MPI_Comm *comm._cart);
1)comm_old – входной коммуникатор
2)число размерности топологии.
3)целочисленные массив размерностью ndims, определяющий количество процессов в каждом измерении
4)целочисленный массив, размером ndims, элементы который определяет периодичность или не периодичность (замкнутость или открытость) для каждого измерения. Периодичность определяется значением TRUE, не периодичность – значением FALSE.
5)признак того могут ли быть перенумерованы ранги процессов если TRUE или не могут быть, если FALSE
6)новый коммуникатор
int MPI_Dims_create(int nnodes, int ndims, int *dims);
1)количество узлов
2)мерность декартовой топологии
3)целочисленный массив, определяющий количество узлов в каждом измерении.
Функция помогает пользователю распределить процессы по направлению координат в зависимости от числа процессов в группе.
Функция приема-передачи
int MPI_Sendrecv(void *sendbuf ,//адрес буфера передаваемых данных
int sendcount,//число переданных элементов
MPI_Datatype sendtype,//тип переданных элементов данных
int dest,//ранг получателя
int sendtag,//таг передаваемого сообщения
void *recvbuf,//адрес буфера приема данных
int recvcount,//количество принимаемых элементов данных
MPI_Datatype recvtype,//тип данных, принимаемых элементов данных.
int sourse,//ранг отправителя.
int recvtag,//таг принимаемого сообщения
MPI_Comm comm.,//коммуникатор
MPI_Status *status //статус сообщения);
Топология графа позволяет создавать любые, в том числе и нерегулярные связи между процессами.
Функция создания топологии графа
int MPI_Graph_create(MPI_Comm commold,//входной коммуникатор
int nnodes,//количество узлов графа
int *index,//целочисленный массив узлов графа
int *edges,//описание ребер графа
int reorder,//признак, определяющий будут ли ранги узлов переупорядочиваться