Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Распараллеливание программ. Учебник

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
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 data­type, 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 data­type, int dest, int tag, MPI_Comm comm)
     


int MPI_Recv(void* buf, int count, MPI_Datatype data­type, 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 data­type, int dest, int tag, MPI_Comm comm, MPI_Request *request)
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]