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

Int _tmain(int argc, _tchar* argv[])

{

int nError = 0;

int nSize = 0;

int nRank = 0;

int* pReadBuf = NULL;

int i=0;

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &nSize);

MPI_Comm_rank(MPI_COMM_WORLD, &nRank);

if(nRank == 0)

{

pReadBuf = (int *)malloc(nSize*sizeof(int));

}

nError = MPI_Gather(&nRank, 1, MPI_INT, pReadBuf, 1, MPI_INT, 0, MPI_COMM_WORLD);

if(nRank == 0)

{

printf("Принятые элементы массива: \n");

for(i=0; i<nSize; i++)

{

printf("%d\n", pReadBuf[i]);

}

}

MPI_Finalize();

return 0;

}

Результат работы функции для 4-х процессов:

Принятые элементы массива:

0

1

2

3

Функция MPI_Scatter(). Эта операция обратна MPI_Gather(), т.е. корневой процесс рассылает данные всем остальным.

int MPI_Scatter(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)

sendbuf - начальный адрес буфера процесса-отправителя(используется только корневым процессом) sendcount количество элементов в отсылаемом сообщении (целое, используется только корневым процессом) sendtype тип элементов в отсылаемом сообщении(используется только корневым процессом) recvbuf начальный адрес буфера процесса сборки данных recvcount количество элементов в принимаемом сообщении recvcount - количество элементов recvtype тип данных элементов в буфере процесса-получателя root номер процесса-получателя (целое) root – номер процесса-получателя comm коммуникатор nError – возвращаемое значение ошибки.

Пример использования. Функция создает массив, количество элементов которого равно количеству процессов, затем заполняет массив идущими подряд числами и рассылает их всем процессам:

Int _tmain(int argc, _tchar* argv[])

{

int nRank = 0;

int nResult = 0;

int* pSendBuf = NULL;

int nRecvBuf = 0;

int nSize = 0;

int i = 0;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &nRank);

MPI_Comm_size(MPI_COMM_WORLD, &nSize);

pSendBuf = (int *)malloc(nSize*sizeof(int));

for(i = 0; i<nSize; i++)

{

pSendBuf[i] = i;

}

nResult = MPI_Scatter(pSendBuf, 1, MPI_INT, &nRecvBuf, 1, MPI_INT, 0, MPI_COMM_WORLD);

if(nResult)

{

printf("MPI_Scatter returned error - %d", nResult);

}

else

{

printf("Process rank - %d", nRank);

printf(" nRecvBuf = %d\n", nRecvBuf);

}

MPI_Finalize();

return 0;

}

Результат работы функции для 4- процессов:

Process rank - 2 nRecvBuf = 2

Process rank - 3 nRecvBuf = 3

Process rank - 0 nRecvBuf = 0

Process rank - 1 nRecvBuf = 1

  1. Функции MPI_Reduce MPI_AllReduce

Функция MPI_Reduce

int nError MPI_Reduce(void* operand, void* result, int count, MPI_Datatype datatype, MPI_Op op,  int root, MPI_Comm comm)

operand- операнды функции result- результат, который сохраняется в корневом процессе count-количество ячеек в памяти, на которые ссылаются и операнд и результат datatype – тип данных op – оператор, с помощью которого производятся вычисления root- номер корневого процесса, в котором сохраняются результаты comm. – коммуникатор.

MPI_Reduce() объединяет операнды, сохраненные в *operand, используя оператор op и сохраняет результат в переменной *result корневого процесса root. И операнд, и результат ссылаются на count ячеек памяти с типом datatype. MPI_Reduce() должны вызывать все процессы в коммуникаторе comm. При вызове значения count, datatype и op должны быть одинаковыми в каждом процессе.

Пример использования. Функция суммирует ранги всех процессов и сохраняет их в нулевом:

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