全部版块 我的主页
论坛 站务区 十一区 新手入门区
1019 1
2015-01-26
今天第一次来,就发一个并行的排序算法,希望大家喜欢,是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;
}

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群