MPI实践——ParallelRank程序

来源:互联网 发布:域名投资怎么理解 编辑:程序博客网 时间:2024/06/07 13:08

MPI实践——ParallelRank程序

1、问题概述

    每一个进程随机产生一个数字存储在本地,然后对比所有进程所包含的整个数字集,进行排序然后分发,最后将排序号输出。

    输入输出如图:

2、算法思路

   整个程序所要做的就是收集所有进程产生的一个随机数,然后进行排序,最后将排序结果发送给各自进程,最后将排序结果发回各进程并进行输出。
   随机数可以用rand()产生,用MPI_Gather将各自数字收集进0进程,排序选用冒泡排序,排序之后利用MPI_Scatter将排序结果分发给各自进程。最后进行输出。流程图如下:


           

3、代码分析

#include <stdio.h>#include <mpi.h>#include <malloc.h>#include <stdlib.h>int main (int argc ,char** argv){int rank,size,i,j;MPI_Init(&argc, &argv);MPI_Comm_size(MPI_COMM_WORLD,&size);MPI_Comm_rank(MPI_COMM_WORLD, &rank);//int *sbuf = (int *) malloc(sizeof(int)  * size);srand(rank*1000);int range;int send = rand();int *sbuf = (int *) malloc(sizeof(int) * size);        int *rbuf = (int *) malloc(sizeof(int) * size);int *sort = (int *) malloc(sizeof(int) * size);        printf("Process %d  rand is %d\n",rank,send);        MPI_Gather(&send, 1, MPI_INT, rbuf, 1, MPI_INT, 0, MPI_COMM_WORLD);if(rank==0)      {for(i=0;i<size;i++){  sort[i] = rbuf[i];  printf("%d ",rbuf[i]);}        putchar('\n');int t;for(i=0;i<size;i++){    for(j=i+1;j<size;j++){if(sort[i]<sort[j]){  t = sort[i];  sort[i] = sort[j];  sort[j] = t;}    }}for(i=0;i<size;i++){  for(j=0;j<size;j++){if(sort[j]==rbuf[i]){  sbuf[i] = j;}  }}      }MPI_Scatter(sbuf, 1, MPI_INT, &range, 1, MPI_INT, 0,  MPI_COMM_WORLD);printf("processa: %d : range %d \n",rank,range);/*if(rank==0){  for(i=0;i<size;i++){            printf("%d ",sbuf[i]);          }  putchar('\n');} */MPI_Finalize();return 0;}

4、结果演示