今天第一次来,就发一个并行的排序算法,希望大家喜欢,是c++的有
#include<iostream>
#include<time.h>
#include<stdio.h>
#include<cmath>
#include<mpi.h>
using namespace std;
int main()
{
int comm_sz=8;
int my_rank;
int i,j,n,k;
int x;
int teb;
int my_rank_n;
int N=1000;
int NUM=10;
int *SLine=new int[N];
int *Stemp=new int[NUM];
MPI_Init(NULL,NULL);
MPI_Comm_size(MPI_COMM_WORLD,&comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
//这一节放在这里可以放在0号核也可以(但是那个地方好呢?)。。。。。。。。。。。。。。。
my_rank_n=int(N/comm_sz);
if(N%comm_sz!=0){
my_rank_n=my_rank_n+1;
teb=N-(comm_sz-1)*my_rank_n;
}
else
teb=my_rank_n;
int *temp=new int[my_rank_n];
srand((unsigned)time(NULL));
if(my_rank==0){
for(i=0;i<N;i++)
SLine[i]=1000*rand();
for(j=1;j<comm_sz;j++){
n=teb+j*my_rank_n;
for(k=teb+(j-1)*my_rank_n,i=0;i<n;i++)
temp[i]=SLine[i+k];
MPI_Send(temp,my_rank_n,MPI_INT,j,0,MPI_COMM_WORLD);
}
for(i=0;i<teb;i++)
temp[i]=SLine[i];
//从中得到最小的10个数
for(i=0;i<NUM;i++){
k=i;
for(j=i+1;j<teb;j++)
if(temp[j]<temp[k])
k=j;
x=temp[i];
temp[i]=temp[k];
temp[k]=x;
}
for(i=0;i<NUM;i++)
Stemp[i]=temp[i];
}
else{
MPI_Recv(temp,my_rank_n,MPI_INT,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
//从中得到最小的10个数,全部发给0号核好了,还是是用树形排序好了?。。。。。。。
for(i=0;i<10;i++){
k=i;
for(j=i+1;j<my_rank_n;j++)
if(temp[j]<temp[k])
k=j;
x=temp[i];
temp[i]=temp[k];
temp[k]=x;
}
for(i=0;i<NUM;i++)
Stemp[i]=temp[i];
MPI_Send(Stemp,NUM,MPI_INT,0,1,MPI_COMM_WORLD);
}
if(my_rank==0){
int *SStemp=new int[NUM];
int *STtemp=new int[NUM];
for(j=1;j<comm_sz;j++){
MPI_Recv(SStemp,NUM,MPI_INT,j,1,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
for(i=0,j=0,k=0;i<NUM;i++){
if(SStemp[j]<Stemp[k]){STtemp[i]=SStemp[j];j++;}
else{STtemp[i]=Stemp[k];k++;}
}
for(i=0;i<NUM;i++)
Stemp[i]=STtemp[i];
}
for(i=0;i<NUM;i++)
cout<<Stemp[i]<<" ";
}
MPI_Finalize();
system("pause");
return 0;
}


雷达卡


京公网安备 11010802022788号







