Int _tmain(int argc, _tchar* argv[])
{
int nRank = 0;
int nSize = 0;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &nRank);
MPI_Comm_size(MPI_COMM_WORLD, &nSize);
if(nSize % 2 == 0)
{
if(nRank % 2 == 0)
{
int nBuf = 100;
int nRes = 0;
int nTestRes = 0;
int nFlag = 0;
MPI_Request request = MPI_REQUEST_NULL;
MPI_Status* status = MPI_STATUS_IGNORE;
// Асинхронная передача
nRes = MPI_Isend(&nBuf, 1, MPI_INT, nRank + 1, nRank, MPI_COMM_WORLD, &request);
If(nRes)
{
printf("MPI_Isend returned error %d\n", nRes);
}
//----------------------------------------MPI_Test-----------------------------------------
// Проверим, что передача завершилась
nTestRes = MPI_Test(&request, &nFlag, status);
if(nTestRes)
{
printf("MPI_Test returned error %d\n", nTestRes);
}
else
{
if(nFlag)
{
printf("MPI_Isend completed \n");
// Если nFlag==true выведем все параметры сообщения
mesParam(*status);
}
}
}
else
{
int nRes = 0;
int nBuf = 0;
int nFlag = 1;
int nProbeRes = 0;
MPI_Request request;
MPI_Status status;
status.cancelled = 0;
status.count = 1;
status.MPI_ERROR = 0;
status.MPI_SOURCE = nRank;
status.MPI_TAG = nRank;
//----------------------------------------MPI_Probe----------------------------------------
// Проверим, что сообщение удовлетворяет нашим требованиям
nProbeRes = MPI_Probe(nRank - 1, nRank - 1, MPI_COMM_WORLD, &nFlag, &status);
if(nProbeRes)
{
printf("MPI_Probe returned error %d\n", nProbeRes);
}
else
{
if(nFlag)
{
int nWaitResult = 0;
printf("Message matches requirements \n");
// Асинхронный прием
nRes = MPI_Irecv(&nBuf, 1, MPI_INT, nRank - 1, nRank - 1, MPI_COMM_WORLD, &request);
If(nRes)
{
printf("MPI_Irecv returned error %d\n", nRes);
}
//----------------------------------------MPI_Wait-------------------------------------
// Если удовлетворяет, подождем пока закончиться прием данных
nWaitResult = MPI_Wait(&request, &status);
if(nWaitResult)
{
printf("MPI_Wait returned error %d\n", nWaitResult);
}
else
{
// Если прием нормально завершился, выведем параметры сообщения на экран
mesParam(status);
}
}
}
}
}
MPI_Finalize();
return 0;
}
Результат работы программы для 2-х процессов:
Message matches requirements
Message parameters:
Not cancelled
Error: 0
Parameters count: 4
Source: 0
Tag: 0
-
Функции MPI_Gather, MPI_Scatter
Функция MPI_Gather(). При выполнении этой функции все процессы рассылают данные корневому процессу (включая сам корневой).
int nError MPI_Gather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);
sendbuf начальный адрес буфера процесса-отправителя sendcount количество элементов в отсылаемом сообщении (целое) sendtype тип элементов в отсылаемом сообщении recvbuf начальный адрес буфера процесса сборки данных (существенно только для корневого процесса) recvcount количество элементов в принимаемом сообщении (целое, имеет значение только для корневого процесса) recvtype тип данных элементов в буфере процесса-получателя root номер процесса-получателя (целое) comm коммуникатор root – номер корневого процесса nError – возвращаемое значение ошибки.
Пример на функцию MPI_Gather(). Все процессы создают переменную типа int и передают ее корневому (нулевому), который сохраняет их в массив, затем выводит на экран:
