【MPI】并行奇偶交换排序

typedef long long __int64;
#include "mpi.h"
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int Compute_partner(int phase,int my_rank,int comm_sz){//根据趟数的奇偶性以及当前编号的编号得到partner进程的编号
    int partner;
    if(!(phase&1)){
        if(my_rank&1){
            partner=my_rank-1;
        }
        else{
            partner=my_rank+1;
        }
    }
    else{
        if(my_rank&1){
            partner=my_rank+1;
        }
        else{
            partner=my_rank-1;
        }
    }
    if(partner==-1 || partner==comm_sz){
        partner=MPI_PROC_NULL;
    }
    return partner;
}
int main(int argc, char* argv[]){
    int my_rank=0, comm_sz=0;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
    int np,n,local_n;//分别为进行奇偶交换排序的趟数和读入的数据总量以及分成的每段的长度
    FILE* fp;
    if(my_rank==0){
        fp=fopen("Sort.txt","r");
        fscanf(fp,"%d%d",&np,&n);
        local_n=n/comm_sz;
    }
    MPI_Bcast(&np,1,MPI_INT,0,MPI_COMM_WORLD);
    MPI_Bcast(&local_n,1,MPI_INT,0,MPI_COMM_WORLD);
    int* keys;
    int* my_keys=new int[local_n];
    if(my_rank==0){
        keys=new int[n];
        for(int i=0;i<n;++i){
            fscanf(fp,"%d",&keys[i]);
        }
        fclose(fp);
    }
    double beginTime = MPI_Wtime();
    MPI_Scatter(keys,local_n,MPI_INT,my_keys,local_n,MPI_INT,0,MPI_COMM_WORLD);

    //sort(my_keys,my_keys+local_n);//串行快速排序

    for(int i=0;i<local_n;++i){//串行奇偶交换排序
        if(!(i&1)){
            for(int j=0;j+1<local_n;j+=2){
                if(my_keys[j]>my_keys[j+1]){
                    swap(my_keys[j],my_keys[j+1]);
                }
            }
        }
        else{
            for(int j=1;j+1<local_n;j+=2){
                if(my_keys[j]>my_keys[j+1]){
                    swap(my_keys[j],my_keys[j+1]);
                }
            }
        }
    }

    int* recv_keys=new int[local_n];
    int* temp_keys=new int[local_n];
    for(int i=0;i<np;++i){
        int partner=Compute_partner(i, my_rank, comm_sz);
        if (partner != MPI_PROC_NULL){
            MPI_Sendrecv(my_keys, local_n, MPI_INT, partner, 0, recv_keys, local_n, MPI_INT, partner, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            if(my_rank<partner){//编号小的进程留下归并时较小的一半
                int e=0,e1=0,e2=0;
                int* temp_keys=new int[local_n];
                while(e<local_n){
                    if(my_keys[e1]<=recv_keys[e2]){
                        temp_keys[e]=my_keys[e1];
                        ++e;
                        ++e1;
                    }
                    else{
                        temp_keys[e]=recv_keys[e2];
                        ++e;
                        ++e2;
                    }
                }
                for(int j=0;j<local_n;++j){
                    my_keys[j]=temp_keys[j];
                }
            }
            else{//编号大的进程留下归并时较大的一半
                int e=local_n-1,e1=local_n-1,e2=local_n-1;
                while(e>=0){
                    if(my_keys[e1]>=recv_keys[e2]){
                        temp_keys[e]=my_keys[e1];
                        --e;
                        --e1;
                    }
                    else{
                        temp_keys[e]=recv_keys[e2];
                        --e;
                        --e2;
                    }
                }
                for(int j=0;j<local_n;++j){
                    my_keys[j]=temp_keys[j];
                }
            }
        }
    }
    MPI_Gather(my_keys, local_n, MPI_INT, keys, local_n, MPI_INT, 0, MPI_COMM_WORLD);
    double endTime = MPI_Wtime();
    if (my_rank == 0){
        for(int i=0;i<n;++i){
            printf("%d ",keys[i]);
        }
        puts("");
        printf("spent time = %lf second\n", endTime - beginTime);
    }
    delete[] keys;
    delete[] my_keys;
    delete[] recv_keys;
    delete[] temp_keys;
    MPI_Finalize();
    return 0;
}

原文地址:https://www.cnblogs.com/autsky-jadek/p/8150990.html

时间: 2025-01-06 11:39:56

【MPI】并行奇偶交换排序的相关文章

【MPI学习2】MPI并行程序设计模式:对等模式 &amp; 主从模式

这里的内容主要是都志辉老师<高性能计算之并行编程技术——MPI并行程序设计> 书上有一些代码是FORTAN的,我在学习的过程中,将其都转换成C的代码,便于统一记录. 这章内容分为两个部分:MPI对等模式程序例子 & MPI主从模式程序例子 1. 对等模式MPI程序设计 1.1 问题背景 这部分以Jacobi迭代为具体问题,列举了三个求解Jacobi迭代问题的MPI对等模式程序. 这里需要阐明一下,书上的Jacobi迭代具体的背景可以参考这个内容:http://www.mcs.anl.g

windows visual studio 2012下MPI并行环境搭建

因为课程作业的缘故需要编写并行计算的程序,准备写一下MPI程序,MPI的全称是Message Passing Interface即标准消息传递界面,可以用于并行计算.MPI的具体实现一般采用MPICH.下面介绍如何在Windows 8系统下visual studio 2012中搭建MPI环境来编写MPI程序. 安装MPI实现库 MPICH官网上给出了windows下的下载地址.可以看出链接到了微软的官网,根据我的版本下载并安装了HPC Pack 2012 SDK.然而在网上查找资料发现都是关于M

【MPI学习6】MPI并行程序设计模式:具有不连续数据发送的MPI程序设计

基于都志辉老师<MPI并行程序设计模式>第14章内容. 前面接触到的MPI发送的数据类型都是连续型的数据.非连续类型的数据,MPI也可以发送,但是需要预先处理,大概有两类方法: (1)用户自定义新的数据类型,又称派生类型(类似定义结构体类型,但是比结构体复杂,需要考虑<类型,偏移量>两方面的内容) (2)数据的打包和解包(将不连续的数据给压缩打包到连续的区域,然后再发送:接受到打包数据后,先解包再使用) 这样做的好处,我猜一个是可以有效减少通信的次数,提高程序效率:另一方面可以减轻

学习MPI并行编程记录

简单的MPI程序示例 首先,我们来看一个简单的MPI程序实例.如同我们学习各种语言的第一个程序一样,对于MPI的第一个程序同样是"Hello Word". /* Case 1 hellow.c */ #include <stdio.h> #include "mpi.h" int main( int argc, char *argv[] ) { int rank; int size;     MPI_Init( argc, argv ); MPI_Comm

【MPI学习3】MPI并行程序设计模式:不同通信模式MPI并行程序的设计

学习了MPI四种通信模式 及其函数用法: (1)标准通信模式:MPI_SEND (2)缓存通信模式:MPI_BSEND (3)同步通信模式:MPI_SSEND (4)就绪通信模式:MPI_RSEND 四种通信模式的区别都在消息发送端,而消息接收端的操作都是MPI_RECV. 1.标准通信模式 原理图如下 标准通信模式由MPI决定是否用缓存. 如果MPI决定缓存将要发出的数据:发送操作不管接受操作是否执行,都可以进行:而且缓存结束后发送操作就可以返回,不需要等待接受操作收到数据 如果MPI决定不缓

MPI编程简单介绍

第三章MPI编程 3.1 MPI简单介绍 多线程是一种便捷的模型,当中每一个线程都能够訪问其他线程的存储空间.因此,这样的模型仅仅能在共享存储系统之间移植.一般来讲,并行机不一定在各处理器之间共享存储,当面向非共享存储系统开发并行程序时,程序的各部分之间通过来回传递消息的方式通信.要使得消息传递方式可移植,就须要採用标准的消息传递库.这就促成的消息传递接口(Message Passing Interface, MPI)的面世,MPI是一种被广泛採用的消息传递标准[1]. 与OpenMP并行程序不

MPI集群配置

参考文档:Linux下MPI并行编程环境搭建配置 MPI是一种并行计算架构,MPICH是MPI的一种实现,本集群使用虚拟机安装,操作系统是ubuntu14.04,使用三台机器,用户名都是ubuntu,机器名分别是ub0, ub1, ub2 安装MPICH 下载:http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz 源码安装 $ tar -xzvf soft/mpich-3.0.4.tar.gz $ cd mpich-3.0.

mpi冒泡排序并行化

一.实验目的与实验要求 1.实验目的 (1)学会将串行程序改为并行程序. (2)学会mpich2的使用. (3)学会openmp的配置. (4)mpi与openmp之间的比较. 2.实验要求 (1)将串行冒泡程序局部并行化,以降低时间消耗. (2) 理论上求出时间复杂度之比,根据结果得出时间消耗之比,进行比对分析. 二.实验设备(环境)及要求 Vs2013,mpich2 三.实验内容与步骤 1.实验一 mpi并行 (1)实验内容 1.写出一个冒泡排序程序,求出其时间复杂度,并运行得到相应的时间消

排序算法系列:奇偶排序算法

概述 在上一篇中我们说到了冒泡排序的原理及实现详解.冒泡排序是一种交换排序,本文还是接着上一讲,说说另一种交换排序算法--奇偶排序. 版权说明 本文链接:http://blog.csdn.net/lemon_tree12138/article/details/50605563 – Coding-Naga - 转载请注明出处 目录 概述 版权说明 目录 奇偶排序算法 算法原理 算法原理图 算法步骤 算法可行性证明 算法过程图 算法实现 算法复杂度分析 Ref GitHub源码下载 奇偶排序算法 奇