MPI 归并排序
2012-08-17 16:14
162 查看
n个处理器 归并n个数据 处理器按编号线性相连(一维线性阵列)每个处理器都有输出能力
数据通过每次归并 数据向size/2 和size/2-1号处理器靠近 最后这两个处理器进行最后归并
数据通过每次归并 数据向size/2 和size/2-1号处理器靠近 最后这两个处理器进行最后归并
#include "mpi.h" #include <stdio.h> #include <stdlib.h> #include <math.h> static inline int next(int self,int m,int q) {//minimum transportation if(self<m) { return self+q; } else { return self-q; } } static inline int pre(int self,int m,int q) { if(self<m) { return self-q; } else { return self+q; } } void merge(int *a,int *b,int *c,int s) { int pa=0; int pb=0; int pc=0; while(pa<s&&pb<s) { if(a[pa]<b[pb]) { c[pc++]=a[pa++]; } else { c[pc++]=b[pb++]; } } while(pa<s) { c[pc++]=a[pa++]; } while(pb<s) { c[pc++]=b[pb++]; } } int main(int argc,char *argv[]) { int self,size; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&self); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Status s; //merge mem int *a=(int*)malloc(size*sizeof(int)); int *b=(int*)malloc(size*sizeof(int)); int *c=(int*)malloc(size*sizeof(int)); int length=1; //condition int end=1; //middle quarter int m=size/2; int q=size/4; //distribute if(0==self) { int arr[]={2,7,5,3,4,6,8,1}; a[0]=arr[0]; for(int i=1;i<size;++i) { MPI_Ssend(&arr[i],1,MPI_INT,i,0,MPI_COMM_WORLD); } } else { MPI_Recv(a,1,MPI_INT,0,0,MPI_COMM_WORLD,&s); } while(1==end&&q>0) { if(self<m-q||self>m+q-1) { int n=next(self,m,q); MPI_Ssend(a,length*2,MPI_INT,n,0,MPI_COMM_WORLD); //calculate no more end=0; } else { int p=pre(self,m,q); MPI_Recv(b,length*2,MPI_INT,p,0,MPI_COMM_WORLD,&s); merge(a,b,c,length); int *t; t=a; a=c; c=t; } length*=2; q/=2;//reduce size } //final two if(m==self) { MPI_Ssend(a,length*2,MPI_INT,m-1,0,MPI_COMM_WORLD); } else if(m-1==self) { MPI_Recv(b,length*2,MPI_INT,m,0,MPI_COMM_WORLD,&s); merge(a,b,c,length); for(int i=0;i<size;++i) { printf("%d ",c[i]); } } free(a); free(b); free(c); MPI_Finalize(); return 0; }
相关文章推荐
- 并行归并排序——MPI
- 归并排序
- 常用算法之排序算法四【归并排序】
- 实用算法的分析与程序设计——分治算法(归并排序,快速排序)
- 归并排序
- poj2299(求逆序对,归并排序)
- 排序算法--归并排序(merge)
- 归并排序求数组中的逆序对
- 我的Java开发学习之旅------>Java经典排序算法之归并排序
- 归并排序
- 原路归并排序
- 算法の归并排序
- 归并排序的AS实现
- 八大排序算法-归并排序
- #1141 : 二分·归并排序之逆序对
- SRM 664 Div2 Hard: BearSortsDiv2(归并排序)
- 归并排序找逆序数
- 链表的排序----链表的归并排序
- 归并排序
- HDU4911——归并排序——Inversion