Некоторые функции mpi




Дата канвертавання18.04.2016
Памер96.86 Kb.
Некоторые функции MPI

Функция

Краткое описание

int MPI_Init ( int *agrc, char ***argv )

Инициализация MPI программ

int MPI_Finalize (void)

Завершение MPI программ

int MPI_Comm_size ( MPI_Comm comm, int *size )

Определение количества процессов

int MPI_Comm_rank ( MPI_Comm comm, int *rank )

Определение ранга процессов

int MPI_Send(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm),

где


- buf – адрес буфера памяти, в котором располагаются данные отправляемого сообщения,

- count – количество элементов данных в сообщении,

- type - тип элементов данных пересылаемого сообщения,

- dest - ранг процесса, которому отправляется сообщение,

- tag - значение-тег, используемое для идентификации сообщений,

- comm - коммуникатор, в рамках которого выполняется передача данных.



Передача сообщений

int MPI_Recv(void *buf, int count, MPI_Datatype type, int source, int tag, MPI_Comm comm, MPI_Status *status),

где


- buf, count, type – буфер памяти для приема сообщения, назначение каж дого отдельного параметра соответствует описанию в MPI_Send,

- source - ранг процесса, от которого должен быть выполнен прием сообщения,

- tag - тег сообщения, которое должно быть принято для процесса,

- comm - коммуникатор, в рамках которого выполняется передача данных,

- status – указатель на структуру данных с информацией о результате выполнения операции приема данных.


Прием сообщений

double MPI_Wtime(void)

Количество секунд, прошедшее от некоторого определенного момента времени в прошлом

int MPI_Bcast(void *buf,int count,MPI_Datatype type,int root,MPI_Comm comm),

где


- buf, count, type – буфер памяти с отправляемым сообщением (для процесса с рангом 0), и для приема сообщений для всех остальных процессов,

- root - ранг процесса, выполняющего рассылку данных,

- comm - коммуникатор, в рамках которого выполняется передача данных.


Широковещательная рассылка данных

int MPI_Reduce(void *sendbuf, void *recvbuf,int count, MPI_Datatype type, MPI_Op op,int root,MPI_Comm comm),

где


- sendbuf - буфер памяти с отправляемым сообщением,

- recvbuf – буфер памяти для результирующего сообщения (только для процесса с рангом root),

- count - количество элементов в сообщениях,

- type – тип элементов сообщений,

- op - операция, которая должна быть выполнена над данными,

- root - ранг процесса, на котором должен быть получен результат,

- comm - коммуникатор, в рамках которого выполняется операция.


Операция передачи данных от всех процессов одному процессу

int MPI_Barrier(MPI_Comm comm)

Синхронизация процессов

int MPI_Isend(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm, MPI_Request *request)

Неблокирующий обмен данными между процессорами


int MPI_Issend(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm, MPI_Request *request)

int MPI_Ibsend(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm, MPI_Request *request)

int MPI_Irsend(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm, MPI_Request *request)

int MPI_Irecv(void *buf, int count, MPI_Datatype type, int source, int tag, MPI_Comm comm, MPI_Request *request)

int MPI_Buffer_attach(void *buf, int size),

где


- buf - буфер памяти для буферизации сообщений,

- size – размер буфера.



Создание буфера памяти для буферизации сообщений

int MPI_Buffer_detach(void *buf, int *size)

Отключение буфера памяти для буферизации сообщений

int MPI_Test( MPI_Request *request, int *flag, MPI_status *status),

где


- request - дескриптор операции, определенный при вызове неблокирующей функции,

- flag - результат проверки (=true, если операция завершена),

- status - результат выполнения операции обмена (только для завершенной операции)


Проверка состояния выполняемой неблокирующей операции передачи данных

int MPI_Wait( MPI_Request *request, MPI_status *status)

Блокирующая операция ожидания завершения операции

int MPI_Sendrecv(void *sbuf,int scount,MPI_Datatype stype,int dest, int stag, void *rbuf,int rcount,MPI_Datatype rtype,int source,int rtag,MPI_Comm comm, MPI_Status *status),

где


- sbuf, scount, stype, dest, stag - параметры передаваемого сообщения,

- rbuf, rcount, rtype, source, rtag - параметры принимаемого сообщения,

- comm - коммуникатор, в рамках которого выполняется передача данных,

- status – структура данных с информацией о результате выполнения операции.


Одновременное выполнение передачи и приема


int MPI_Scatter(void *sbuf,int scount,MPI_Datatype stype, void *rbuf,int rcount,MPI_Datatype rtype, int root, MPI_Comm comm),

где


- sbuf, scount, stype - параметры передаваемого сообщения (scount определяет количество элементов, передаваемых на каждый процесс),

- rbuf, rcount, rtype - параметры сообщения, принимаемого в процессах,

- root – ранг процесса, выполняющего рассылку данных,

- comm - коммуникатор, в рамках которого выполняется передача данных.


Обобщенная передача данных от одного процесса всем процессам


int MPI_Gather(void *sbuf,int scount,MPI_Datatype stype, void *rbuf,int rcount,MPI_Datatype rtype, int root, MPI_Comm comm),

где


- sbuf, scount, stype - параметры передаваемого сообщения,

- rbuf, rcount, rtype - параметры принимаемого сообщения,

- root – ранг процесса, выполняющего сбор данных,

- comm - коммуникатор, в рамках которого выполняется передача данных.



Обобщенная передача данных от всех процессов одному процессу





int MPI_Alltoall(void *sbuf,int scount,MPI_Datatype stype, void *rbuf,int rcount,MPI_Datatype rtype,MPI_Comm comm),

где


- sbuf, scount, stype - параметры передаваемых сообщений,

- rbuf, rcount, rtype - параметры принимаемых сообщений

- comm - коммуникатор, в рамках которого выполняется передача данных.

Общая передача данных от всех процессов всем процессам





int MPI_Allreduce(void *sendbuf, void *recvbuf,int count,MPI_Datatype type, MPI_Op op,MPI_Comm comm)

Получение результатов редукции данных на каждом из процессов коммуникатора

int MPI_Scan(void *sendbuf, void *recvbuf,int count,MPI_Datatype type, MPI_Op op,MPI_Comm comm)

Получение всех частичных результатов редуцирования

int MPI_Type_extent ( MPI_Datatype type, MPI_Aint *extent )

Получения значения протяженности типа в MPI

int MPI_Type_size ( MPI_Datatype type, MPI_Aint *size )

Получения размера типа в MPI

int MPI_Type_lb ( MPI_Datatype type, MPI_Aint *disp )

Определение нижней и верхней границ типа

int MPI_Type_ub ( MPI_Datatype type, MPI_Aint *disp )

int MPI_Address ( void *location, MPI_Aint *address )

Функция получения адреса переменной

int MPI_Type_contiguous(int count,MPI_Data_type oldtype,MPI_Datatype *newtype)

Непрерывный способ конструирования производного типа данных в MPI

int MPI_Type_vector ( int count, int blocklen, int stride, MPI_Data_type oldtype, MPI_Datatype *newtype ),

где


- count – количество блоков,

- blocklen - размер каждого блока

- stride – количество элементов расположенных между двумя соседними блоками

- oldtype - исходный тип данных,

- newtype - новый определяемый тип данных

Векторный способ конструирования производного типа данных в MPI


int MPI_Type_indexed ( int count, int blocklens[], int indices[], MPI_Data_type oldtype, MPI_Datatype *newtype ),

где


- count – количество блоков,

- blocklens - количество элементов в каждов блоке

- indices – смещение каждого блока от начала типа (в количестве элементов исходного типа),

- oldtype - исходный тип данных,

- newtype - новый определяемый тип данных.

Индексный способ конструирования производного типа данных в MPI





int MPI_Type_struct ( int count, int blocklens[], MPI_Aint indices[], MPI_Data_type oldtypes[], MPI_Datatype *newtype ),

где


- count – количество блоков,

- blocklens – количество элементов в каждом блоке в отдельности

- indices – смещение каждого блока от начала типа (в байтах),

- oldtypes - исходные типы данных, в каждом блоке в отдельности

- newtype - новый определяемый тип данных.


Структурный способ конструирования производного типа данных в MPI

int MPI_Type_commit (MPI_Datatype *type )

Объявление производных типов

int MPI_Type_free (MPI_Datatype *type )

Удаление производных типов

int MPI_Pack ( void *data, int count, MPI_Datatype type, void *buf, int bufsize, int *bufpos, MPI_Comm comm),

где data – буфер памяти с элементами для упаковки,

- count – количество элементов в буфере,

- type – тип данных для упаковываемых эл ементов,

- buf - буфер памяти для упаковки,

- buflen – размер буфера в байтах,

- bufpos – позиция для начала записи в буфер (в байтах от начала буфера),

- comm - коммуникатор для упакованного сообщения.



Функция упаковки в буфер

int MPI_Pack_size (int count, MPI_Datatype type, MPI_Comm comm, int *size)

Функция для определения необходимого размера буфера для упаковки

int MPI_Unpack (void *buf, int bufsize, int *bufpos, void *data, int count, MPI_Datatype type, MPI_Comm comm),

где


- buf - буфер памяти с упакованными данными,

- buflen – размер буфера в байтах,

- bufpos – позиция начала данных в буфере (в байтах от начала буфера),

- data – буфер памяти для распаковываемых данных,

- count – количество элементов в буфере,

- type – тип распаковываемых данных,

- comm - коммуникатор для упакованного сообщения.


Функция распаковки из буфера

int MPI_Comm_group ( MPI_Comm comm, MPI_Group *group)

Получение группы, связанной с существующим коммуникатором

int MPI_Group_incl(MPI_Group oldgroup,int n, int *ranks, MPI_Group *newgroup)

Создание новой группы newgroup из существующей группы oldgroup, которая будет включать в себя n процессов, ранги которых перечисляются в массиве ranks:

int MPI_Group_excl(MPI_Group oldgroup,int n, int *ranks, MPI_Group *newgroup)

Создание новой группы newgroup из группы oldgroup, которая будет включать в себя n процессов, ранги которых не совпадают с рангами, перечисленными в массиве ranks:

int MPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup)

Создание новой группы newgroup как объединения групп group1 и group2

int MPI_Group_intersection ( MPI_Group group1, MPI_Group group2, MPI_Group *newgroup )

Создание новой группы newgroup как пересечения групп group1 и group2

int MPI_Group_difference ( MPI_Group group1, MPI_Group group2, MPI_Group *newgroup )

Создание новой группы newgroup как разности групп group1 и group2

int MPI_Group_size ( MPI_Group group, int *size )

Получение количества процессов в группе

int MPI_Group_rank ( MPI_Group group, int *rank )

Получение ранга текущего процесса в группе

int MPI_Group_free ( MPI_Group *group )

Удаление группы

int MPI_Comm_dup ( MPI_Comm oldcom, MPI_comm *newcomm )

Дублирование уже существующего коммуникатора

int MPI_comm_create (MPI_Comm oldcom, MPI_Group group, MPI_Comm *newcomm)

Создание нового коммуникатора из подмножества процессов существующего коммуникатора

int MPI_Cart_create(MPI_Comm oldcomm, int ndims, int *dims, int *periods, int reorder, MPI_Comm *cartcomm),

где:


- oldcomm - исходный коммуникатор,

- ndims - размерность декартовой решетки,

- dims - массив длины ndims, задает количество процессов в каждом измерении решетки,

- periods - массив длины ndims, определяет, является ли решетка периодической вдоль каждого измерения,

- reorder - параметр допустимости изменения нумерации процессов,

- cartcomm – создаваемый коммуникатор с декартовой топологией процессов.



Функция создания декартовой топологии

int MPI_Card_coords(MPI_Comm comm,int rank,int ndims,int *coords),

где:


- comm – коммуникатор с топологией решетки,

- rank - ранг процесса, для которого определяются декартовы координаты,

- ndims - размерность решетки,

- coords - возвращаемые функцией декартовы координаты процесса.



Определение декартовых координат процесса по его рангу

int MPI_Cart_rank(MPI_Comm comm, int *coords, int *rank),

где


- comm – коммуникатор с топологией решетки,

- coords - декартовы координаты процесса,

- rank - возвращаемый функцией ранг процесса.


Определение ранга процесса по его декартовым координатам

int MPI_Card_sub(MPI_Comm comm, int *subdims, MPI_Comm *newcomm),

где


: - comm - исходный коммуникатор с топологией решетки,

- subdims – массив для указания, какие измерения должны остаться в создаваемой подрешетке,

- newcomm - создаваемый коммуникатор с подрешеткой


Разбиение решетки на подрешетки меньшей размерности

int MPI_Graph_create(MPI_Comm oldcomm, int nnodes, int *index, int *edges, int reorder, MPI_Comm *graphcomm),

где


- oldcomm - исходный коммуникатор,

- nnodes - количество вершин графа,

- index - количество исходящих дуг для каждой вершины,

- edges - последовательный список дуг графа,

- reorder - параметр допустимости изменения нумерации процессов,

- cartcomm – создаваемый коммуникатор с топологией типа граф.



Создание коммуникатора с топологией типа граф в MPI

int MPI_Graph_neighbors_count(MPI_Comm comm,int rank, int *nneighbors)

Количество соседних процессов, в которых от проверяемого процесса есть выходящие дуги

int MPI_Graph_neighbors(MPI_Comm comm,int rank,int mneighbors, int *neighbors)

Получение рангов соседних вершин


База данных защищена авторским правом ©shkola.of.by 2016
звярнуцца да адміністрацыі

    Галоўная старонка