输入N个数的数组, 对数组里的数分给若干个进程进行分别计算, 要求用点对点通信, 不能用广播
我的做法是在rank = 0 的进程里输入N以及数组, 再将数组和N发送给其他进程, 其他进程收到之后进行计算,计算完成后再发给进程0, 进程0进行输出。
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main(int argc, char** argv)
{
int rank , size;
MPI_Comm comm = MPI_COMM_WORLD;
MPI_Init(&argc, &argv);
MPI_Comm_size(comm, &size);
MPI_Comm_rank(comm, &rank);
MPI_Status status;
int N,i,j;
int pmax[size];
if(rank == 0)
{
printf("N = ");
scanf("%d", &N);
int array[N];
for(i = 0 ; i < N; i ++)
scanf("%d", &array[i]);
for(i = 1; i < size; i++)
{
MPI_Send(&N, 1, MPI_INT, i, 99, MPI_COMM_WORLD);
MPI_Send(&array, N, MPI_INT, i, 98, MPI_COMM_WORLD);
}
for(i = 1; i <= size - 1; i++)
{
MPI_Recv(&pmax[i-1], 1, MPI_INT, i, 97, comm,&status);
}
int max = pmax[0];
for(j = 1; j < size -1; j++)
{
if(max < pmax[j])
max = pmax[j];
}
printf("max is %d\n", max);
}
else
{
MPI_Recv(&N, 1, MPI_INT, 0, 99, comm,&status);
int array2[N];
MPI_Recv(&array2, N, MPI_INT, 0, 98, comm,&status);
int start, end;
start = (rank - 1) * (N/(size - 1));
end = rank * (N/(size - 1));
int pmax[size];
int max = 0;
if(rank != size - 1)
{
for(i = start; i < end; i++)
{
if(max < array2[i])
{
max = array2[i];
}
}
}
else
{
for(i = start; i < N; i++)
{
if(max < array2[i])
{
max = array2[i];
}
}
}
printf("max in process %d is %d, start from %d\n", rank, max, start);
MPI_Send(&max, 1, MPI_INT, 0, 97, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}