要求
用若干进程模拟若干员工,编写程序将其工资多少排序,要求非根进程不能得知所有员工的工资,但是需要知道自己的工资排在多少位。
代码:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#include<malloc.h>
#include<stdlib.h>
typedef struct
{
int val;
int rank;
}DATATYPE;
int main(int argc, char** argv)
{
int rank , size;
DATATYPE* rbuf;
DATATYPE sdata;
MPI_Comm comm = MPI_COMM_WORLD;
MPI_Init(&argc, &argv);
MPI_Comm_size(comm, &size);
MPI_Comm_rank(comm, &rank);
MPI_Status status;
srand(time(NULL) + rank);
printf("process %d has ", rank);
sdata.val = rand()%100;
sdata.rank = rank;
printf("%d\n", sdata.val);
if(rank == 0)
{
rbuf = (DATATYPE*)malloc(sizeof(DATATYPE) * size);
}
MPI_Gather(&sdata, 1, MPI_2INT, rbuf, 1, MPI_2INT,0, comm);
int sbuf[size];
if(rank == 0)
{
int i, j;
for(i = 0; i < size -1; i++)
for(j = 0; j < size - 1 - i; j++)
{
DATATYPE tmp;
if(rbuf[j].val < rbuf[j+1].val)
{
tmp = rbuf[j+1];
rbuf[j+1] = rbuf[j];
rbuf[j] = tmp;
}
}
printf("the sequence is: \n");
for(i = 0; i < size; i++)
printf("num:%d from process %d\n", rbuf[i].val, rbuf[i].rank);
for(i = 0; i < size; i++)
{
sbuf[rbuf[i].rank] = i;
}
}
int num;
MPI_Scatter(sbuf, 1, MPI_INT, &num, 1, MPI_INT, 0, comm);
printf("process %d, receives: %d\n", rank, num);
MPI_Finalize();
return 0;
}