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;
}

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

  1. MPI 并行奇偶交换排序 + 集合通信函数 Sendrecv() Sendvecv_replace()

    ▶ <并行程序设计导论>第三章的例子程序 ● 代码 #include <stdio.h> #include <mpi.h> #include <stdlib. ...

  2. MPI实现并行奇偶排序

    奇偶排序 odd-even-sort, using MPI 代码在 https://github.com/thkkk/odd-even-sort 使用 MPI 实现奇偶排序算法, 并且 MPI 进程 ...

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

    基于都志辉老师<MPI并行程序设计模式>第14章内容. 前面接触到的MPI发送的数据类型都是连续型的数据.非连续类型的数据,MPI也可以发送,但是需要预先处理,大概有两类方法: (1)用户 ...

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

    这里的内容主要是都志辉老师<高性能计算之并行编程技术——MPI并行程序设计> 书上有一些代码是FORTAN的,我在学习的过程中,将其都转换成C的代码,便于统一记录. 这章内容分为两个部分: ...

  5. C++程序中调用MPI并行的批处理命令

    问题来源:在使用MPI时,将程序并行实现了,运行时需要在dos窗口下输入批处理命令,以完成程序的执行. 如:mpiexec -localroot -n 6 d:/mpi/pro.exe 但每次这样挺麻 ...

  6. 【MPI学习7】MPI并行程序设计模式:MPI的进程组和通信域

    基于都志辉老师MPI编程书中的第15章内容. 通信域是MPI的重要概念:MPI的通信在通信域的控制和维护下进行 → 所有MPI通信任务都直接或间接用到通信域这一参数 → 对通信域的重组和划分可以方便实 ...

  7. 【MPI学习4】MPI并行程序设计模式:非阻塞通信MPI程序设计

    这一章讲了MPI非阻塞通信的原理和一些函数接口,最后再用非阻塞通信方式实现Jacobi迭代,记录学习中的一些知识. (1)阻塞通信与非阻塞通信 阻塞通信调用时,整个程序只能执行通信相关的内容,而无法执 ...

  8. 学习MPI并行编程记录

    简单的MPI程序示例 首先,我们来看一个简单的MPI程序实例.如同我们学习各种语言的第一个程序一样,对于MPI的第一个程序同样是"Hello Word". /* Case 1 he ...

  9. 【MPI学习5】MPI并行程序设计模式:组通信MPI程序设计

    相关章节:第13章组通信MPI程序设计. MPI组通信与点到点通信的一个重要区别就是:组通信需要特定组内所有成员参与,而点对点通信只涉及到发送方和接收方. 由于需要组内所有成员参与,因此也是一种比较复 ...

随机推荐

  1. G - Pandaland HDU - 6005 (找最小环)

    题目链接:https://cn.vjudge.net/contest/275153#problem/G 具体思路: 我们可以按照暴力的方法进行做 , 我们可以枚举每一条边,将这条边的权值设置为inf, ...

  2. 【Python学习笔记】Jupyter Lab目录插件安装

    Jupyter Lab目录插件安装 当然首先你得有python和已经安装了jupyter lab. 1 安装jupyter_contrib_nbextensions 首先先安装jupyter_cont ...

  3. Github授权新的设备ssh接入

    为Mac生成公钥 步骤: 检查本机是否已有公钥 ls -la ~/.ssh 将原来的公钥删除 rm -rf ~/.ssh 生成新的公钥(填自己的邮箱),然后除了密码,一路默认 ssh-keygen - ...

  4. http://s22.app1105796624.qqopenapp.com/

    http://s22.app1105796624.qqopenapp.com/ http://121.43.114.69/xiyou/app/js/ac_tx.js http://hiyouba.co ...

  5. Vue 实现countDown倒计时

    项目中要用到倒计时,用Vue 实现了一个 <template> <transition name="bkcd"> <div class="b ...

  6. BatchNorm caffe源码

    1.计算的均值和方差是channel的 2.test/predict 或者use_global_stats的时候,直接使用moving average use_global_stats 表示是否使用全 ...

  7. Fiddler 4 抓包(APP HTTPS )

    一.手机连接Fiddler 1.配置fiddler 1.安装fiddler,基本下一步下一步即可: 2.打开fiddler,点击顶部栏Tools——>Options 3.在HTTPS页签勾选“D ...

  8. P1183 多边形的面积

    一道睡论数论题 其实是AC300祭才做的水题 题意: 很直白的的题意啊,就是求任意一个多边形的面积 所以我们来安利一下一个求多边形面积的数学通式: 给定多边形的顶点坐标(有序),让你来求这个多边形的面 ...

  9. master..xp_fileexist

    declare @sql varchar(800) set @sql='E:\temp.dbf'create table #tb(a bit,b bit,c bit)   insert into #t ...

  10. Kubernetes之YAML文件

    一.YAML 基础 YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便.它实质上是一种通用的数据串行化格式.后文会说明定义YAML文件创建Pod和创建Deployment. YA ...