Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие по MPI (реферат) (2).doc
Скачиваний:
34
Добавлен:
28.06.2014
Размер:
108.03 Кб
Скачать

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

  1. Функции 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 и передают ее корневому (нулевому), который сохраняет их в массив, затем выводит на экран:

Соседние файлы в предмете Параллельные вычислительные системы