Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Распараллеливание программ. Учебник
.pdf
161
MPI_Status status; /* информация о полученном сообщении
*/
/* Начать работу с MPI */
MPI_Init (&argc, &argv);
/* Получить номер текущего процесса в группе всех
процессов */
MPI_Comm_rank (MPI_COMM_WORLD, &my_rank);
/* Получить общее количество запущенных процессов */
MPI_Comm_size (MPI_COMM_WORLD, &р);
/* Посылаем сообщения процессу 0, который их выводит на
экран */
if (my_rank != 0)
{
/* Создаем сообщение */
sprintf(message, «Hello from process %d!», my_rank) ;
/* Отправляем его процессу 0 */
dest = 0;
MPI_Send(message, strlen (message) + 1 ,MPI_CHAR,
dest,tag, MPI_COMM_WORLD);
}
else
{
/* В процессе 0: получаем сообщение от процессов
1,...,р-1
и выводим его на экран */
for (source = 1; source < p; source++)
{
MPI_Recv(message, BUF_LEN, MPI_CHAR, source,
tag, MPI_COMM_WORLD, status);
printf(«%s\n», message);
}
}
/* Заканчиваем работу с MPI */
MPI_Finalize();
return 0;
}
Основные свойства

162
Код возврата Описание
MPI_SUCCESS
MPI_ERR_BUFFER
MPI_ERR_COUNT
MPI_ERR_TYPE
MPI_ERR_TAG
MPI_ERR_COMM
MPI_ERR_RANK
MPI_ERR_REQUEST
MPI_ERR_ROOT
MPI_ERR_GROUP
MPI_ERR_OP
MPI_ERR_TOPOLOGY
Успешное выполнение без ошибок
Неправильный указатель буфера
Неправильный аргумент count
Неправильный тип данных
Неправильный тэг
Неправильный коммуникатор
Неправильный номер процесса
Неправильный дескриптор запроса
Неправильный номер корневого процесса
Неправильная группа
Неправильная операция
Неправильная топология

163
Код возврата Описание
MPI_ERR_DIMS
MPI_ERR_ARG
MPI_ERR_UNKNOWN
MPI_ERR_TRUNCATE
MPI_ERR_OTHER
MPI_ERR_INTERN
MPI_PENDING
MPI_ERR_IN_
STATUS
MPI_ERR_LASTCODE
Неправильно определенные измерения решётки
Неправильные аргументы других типов
Неизвестная ошибка
Сообщение усечено при приёме
Ранее не перечисленная известная ошибка
Внутренняя ошибка MPI (реализации)
Зависший запрос
Описание ошибки возвращено в статусе
Последний код ошибок
MPI_ERR_UNKNOWN MPI_ERR_OTHER
MPI_ERR_UNKNOWN MPI_ERR_
OTHER
MPI C
MPI_CHAR
MPI_SHORT
MPI_INT
MPI_LONG
MPI_LONG_LONG_INT
MPI_UNSIGNED_CHAR
MPI_UNSIGNED_SHORT
MPI_UNSIGNED
MPI_UNSIGNED_LONG
MPI_FLOAT
MPI_DOUBLE
MPI_LONG_DOUBLE
MPI_BYTE
char
short
int
long
long long
unsigned char
unsigned short
unsigned int
unsigned long
oat
double
long double

164
MPI C
MPI_PACKED
Константы, набранные блеклым шрифтом, являются необязательными
MPI_
BYTE
MPI_PACKED.
Дескриптор Описание
MPI_COMM_WORLD
MPI_COMM_SELF
MPI_GROUP_EMPTY
MPI_GROUP_NULL
MPI_COMM_NULL
MPI_DATATYPE_NULL
MPI_REQUEST_NULL
MPI_OP_NULL
MPI_ERRHANDLER_NULL
Дескриптор коммуникатора содержащего все процессы приложения
Дескриптор коммуникатора, содержащего только
текущий процесс
Дескриптор, обозначающий пустую группу
NULL-дескрипторы
Константы Пояснения
MPI_BOTTOM
MPI_PROC_NULL
MPI_ANY_SOURCE
MPI_ANY_TAG
MPI_UNDEFINED
MPI_BSEND_OVERHEAD
MPI_KEYVAL_INVALID
MPI_GRAPH
MPI_CART
Пустой процесс. Используется для удобства/единообразия
программ, когда для некоторых процессов не требуется
выполнять действительный обмен.
Шаблон, соответствующий любому номеру процессаисточника сообщения
Шаблон, соответствующий любому тегу сообщения
Используется для обозначения неизвестного или бессмысленного в данном контексте значения
Топология коммуникатора является графом общего вида
Топология коммуникатора является декартовой решеткой

165
MPI_
MPI_SUCCESS
IERR
Среда выполнения
int MPI_Init(int *argc, char ***argv)
argc argv
main()
int MPI_Finalize(void)
int MPI_Abort(MPI_Comm comm, int errorcode)
comm
errcode

166
MPI_COMM_WORLD
int main(argc, argv)
int argc;
char **argv;
{
MPI_Init(&argc, &argv);
/* parse arguments */
/* main program */
MPI_Finalize();
}
int MPI_Initialized(int *flag)
MPI_INIT().
int MPI_Comm_size(MPI_Comm comm, int *size)
comm
int MPI_Comm_rank(MPI_Comm comm, int *rank)
rank
comm
Взаимодействия точка-точка

167
Блокирующий Неблокирующий
Синхронный
Буферизованный
По готовности
Стандартный
Прием
Проверка
Комбинированная
операция
MPI_SSEND MPI_ISSEND
MPI_BSEND MPI_IBSEND
MPI_RSEND MPI_IRSEND
MPI_SEND MPI_ISEND
MPI_RECV MPI_IRECV
MPI_PROBE MPI_IPROBE
MPI_SENDRECV
MPI_SENDRECV_REPLACE
нет

168
Одна операция
Много операций, завершилась одна
Много операций, завершились все
Много операций, завершилась, по крайней мере, одна
Проверка
(неблокирующая)
MPI_TEST MPI_WAIT
MPI_TESTANY MPI_WAITANY
MPI_TESTALL MPI_WAITALL
MPI_TESTSOME MPI_WAITSOME
Ожидание
(блокирующее)
int MPI_Send(void* buf, int count, MPI_Datatype data-
type,
int dest, int tag, MPI_Comm comm)
int MPI_Ssend(void* buf, int count, MPI_Datatype data-
type,
int dest, int tag, MPI_Comm comm)
int MPI_Bsend(void* buf, int count, MPI_Datatype datatype,
int dest, int tag, MPI_Comm comm)

169
MPI_RSEND (buf, count, datatype, dest, tag, comm)
int MPI_Rsend(void* buf, int count, MPI_Datatype datatype,
int dest, int tag, MPI_Comm comm)
int MPI_Recv(void* buf, int count, MPI_Datatype datatype,
int source, int tag,
MPI_Comm comm, MPI_Status *status)
SOURCE
MPI_ANY_TAG
MPI_ANY_
int MPI_Sendrecv(void *sendbuf, int sendcount,
MPI_Datatype sendtype, int dest,
int sendtag, void *recvbuf, int recvcount,
MPI_Datatype recvtype, int source,
MPI_Datatype recvtag,
MPI_Comm comm, MPI_Status *status)

170
int MPI_Sendrecv_replace(void* buf, int count,
MPI_Datatype datatype,
int dest, int sendtag, int source, int recvtag,
MPI_Comm comm, MPI_Status *status)
SOURCE
MPI_ANY_TAG
MPI_ANY_
int MPI_Probe(int source, int tag, MPI_Comm comm,
MPI_Status *status)
int MPI_Isend(void* buf, int count, MPI_Datatype datatype,
int dest, int tag,
MPI_Comm comm, MPI_Request *request)
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
