- •Двухточечный обмен
- •Int mpi_Testall(int count, mpi_Request requests[], int *flag, mpi_Status statuses[])
- •Коллективный обмен
- •Int mpi_Scatterv(void *sendbuf, int *sendcounts, int *displs,
- •Int mpi_Alltoallv(void *sendbuf, int *sendcounts, int *sdispls,
- •Int mpi_Reduce(void *buf, void *result, int count,
- •Int mpi_Op_create(mpi_User_function *function, int commute, mpi_Op *op)
- •Int mpi_Allreduce(void *sendbuf, void *rcvbuf, int count,
- •Int mpi_Scan(void *sendbuf, void *rcvbuf, int count, mpi_Datatype datatype, mpi_Op op, mpi_Comm comm)
- •Int mpi_Intercomm_create(mpi_Comm local_comm, int local_leader,
- •Топологии
- •Int mpi_Cart_coords(mpi_Comm comm, int rank, int maxdims, int *coords)
- •Int mpi_Cart_map(mpi_Comm comm_old, int ndims, int *dims, int *periods, int *newrank)
- •Производные типы
- •Атрибуты
- •Void *extra_state, void *attribute_val_in, void *attribute_val_out, int *flag)
- •Int mpi_Keyval_free(int *keyval)
- •Int mpi_Attr_put(mpi_Comm comm, int keyval, void* attribute)
- •Int mpi_Attr_get(mpi_Comm comm, int keyval, void *attribute, int *flag)
- •Int mpi_Attr_delete(mpi_Comm comm, int keyval)
- •Задание 3
Int mpi_Intercomm_create(mpi_Comm local_comm, int local_leader,
MPI_Comm peer_comm, int remote_leader, int tag, MPI_Comm *new_intercomm)
MPI_INTERCOMM_CREATE(LOCAL_COMM, LOCAL_LEADER, PEER_COMM, REMOTE_LEADER, TAG, NEW_INTERCOMM, IERR)
Входные параметры:
local_comm - локальный интракоммуникатор;
local_leader - ранг лидера в локальном коммуникаторе (обычно 0);
peer_comm - удаленный коммуникатор;
remote_leader - ранг лидера в удаленном коммуникаторе (обычно 0);
tag - тег интеркоммуникатора, используемый лидерами обеих групп для обменов в контексте родительского коммуникатора.
Выходной параметр:
new_intercomm - интеркоммуникатор.
"Джокеры" в качестве параметров использовать нельзя. Вызов этой подпрограммы должен выполняться в обеих группах процессов, которые должны быть связаны между собой. В каждом из этих вызовов используется локальный интракоммуникатор, соответствующий данной группе процессов. При работе сMPI_Intercomm_create локальная и удаленная группы процессов не должны пересекаться, иначе возможны "тупики".
Топологии
Виртуальные топологии в MPI позволяют использовать более удобные способы обращения к процессам, входящим в состав параллельной программы.
Создание нового коммуникатора comm_cart посредством наделения декартовой топологией исходный коммуникатор comm_old (рис. 3.10)
int MPI_Cart_create(MPI_Comm comm_old, int ndims, int *dims,
int *periods, int reorder, MPI_Comm *comm_cart)
MPI_CART_CREATE(COMM_OLD, NDIMS, DIMS, PERIODS, REORDER, COMM_CART, IERR)
Входные параметры:
comm_old - исходный коммуникатор;
ndims - размерность декартовой решетки;
dims -целочисленный массив, состоящий из ndims элементов, задающий количество процессов в каждом измерении;
periods - логический массив из ndims элементов, который определяет, является ли решетка периодической (значениеtrue ) вдоль каждого измерения;
reorder - при значении этого параметра "истина", системе разрешено менять порядок нумерации процессов.
Информация о структуре декартовой топологии содержится в параметрах ndims, dims и periods. MPI_Cart_create является коллективной операцией (эту подпрограмму должны вызывать все процессы из коммуникатора, наделяемого декартовой топологией).
Рис. 3.10. Декартова топология
Определение декартовых координат процесса по его рангу в группе
Int mpi_Cart_coords(mpi_Comm comm, int rank, int maxdims, int *coords)
MPI_CART_COORDS(COMM, RANK, MAXDIMS, COORDS, IERR)
Входные параметры:
comm - коммуникатор, наделенный декартовой топологией;
rank - ранг процесса в comm ;
maxdims - длина вектора coords в вызывающей программе.
Выходной параметр:
coords - одномерный целочисленный массив (его размер равен ndims ), содержащий декартовы координаты процесса.
Определение ранга процесса (rank) по его декартовым координатам в коммуникаторе comm int
MPI_Cart_rank(MPI_Comm comm, int *coords, int *rank)
MPI_CART_RANK(COMM, COORDS, RANK, IERR)
Входной параметр:
coords - целочисленный массив размера ndims, задающий декартовы координаты процесса. Как MPI_Cart_rank, так и MPI_Cart_coords локальны.
Расщепление коммуникатора comm на подгруппы, соответствующие декартовым подрешеткам меньшей размерности
int MPI_Cart_sub(MPI_Comm comm, int *remain_dims, MPI_Comm *comm_new)
MPI_CART_SUB(COMM, REMAIN_DIMS, COMM_NEW, IERR)
I -й элемент массива remain_dims определяет, содержится ли I-е измерение в подрешетке ("истина"). Выходной параметр:
newcomm - коммуникатор, содержащий подрешетку, которой принадлежит данный процесс.
Подпрограмма MPI_Cart_sub используется только с коммуникатором, наделенным декартовой топологией.
Получение информации о декартовой топологии, связанной с коммуникатором comm
int MPI_Cart_get(MPI_Comm comm, int maxdims, int *dims, int *periods, int *coords)
MPI_CART_GET(COMM, MAXDIMS, DIMS, PERIODS, COORDS, IERR)
Входной параметр:
maxdims - задает длину массивов dims, periods и vectors в вызывающей программе
Выходные параметры:
dims - целочисленный массив, задающий количество процессов для каждого измерения;
periods - массив логических значений, задающих периодичность ( true, если решетка периодическая) для каждого измерения;
coords - целочисленный массив, задающий декартовы координаты вызывающего подпрограмму процесса.
Определение ранга процесса (newrank) в декартовой топологии после переупорядочения процессов