楼主: zq303889724
1018 1

[新手尝试] 并行的初级尝试 [推广有奖]

  • 0关注
  • 0粉丝

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0.0150
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2015-1-26
最后登录
2015-1-26

楼主
zq303889724 发表于 2015-1-26 19:24:44 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
今天第一次来,就发一个并行的排序算法,希望大家喜欢,是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;
}

二维码

扫码加我 拉你入群

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

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

关键词:include World Using 望大家喜欢 Space include

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
扫码
拉您进交流群
GMT+8, 2026-2-7 11:06