
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
-
Функции 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 должны быть одинаковыми в каждом процессе.
Пример использования. Функция суммирует ранги всех процессов и сохраняет их в нулевом: