您的位置:首页 > 其它

MPI 归并排序

2012-08-17 16:14 162 查看
n个处理器 归并n个数据 处理器按编号线性相连(一维线性阵列)每个处理器都有输出能力

数据通过每次归并 数据向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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: