思想:

(1) 对于一个nxm的数组,使用N个work进行处理.
(2) 先按行对数组进行升序和降序排序【由左至右】,一般奇数序列work升序,偶数序号的work进行降序
(3)再按列对数组进行升序排序【由上至下】
(4)当数据不再发生变化时,终止退出.


/*
----------------------------------
Version : ??
File Name : ShearSort.py
Description :
Author : xijun1
Email : xijun1@staff.weibo.com
Date : 2018/12/18
-----------------------------------
Change Activity : 2018/12/18
-----------------------------------
__author__ = 'xijun1'
*/ #include "mpi.h"
#include <algorithm>
#include <iostream>
#include <vector>
#include <cassert>
using std::cin;
using std::cout;
using std::endl;
using std::vector; //归并排序
bool Less(int a, int b){
return a <b;
} bool Greater(int a, int b){
return a > b;
}
//升序
bool Merge(int *A ,int ps ,int mid , int len , bool( * Comp)(int a , int b) ){
int i=ps,j=mid,cnt=0;
int C[len-ps+1];
bool is_change = false;
while(i<mid&&j<len ){
if(Comp(A[i] , A[j])) {
C[cnt++] = A[j++];
is_change= true;
}
else C[cnt++]=A[i++];
}
while(i<mid) C[cnt++]=A[i++];
while(j<len) C[cnt++]=A[j++];
for(i=ps; i<len ;i++)
A[i]=C[i-ps];
return is_change;
} //非递归版
bool Msort_(int *arg , int ps , int len , bool( * Comp)(int a , int b) ){ int s,t=1;
bool is_change = false;
while(ps+t<=len){
s=t;
t=2*s;
int pos=ps;
while(pos+t<=len){
is_change |= Merge(arg,pos,pos+s,pos+t , Comp);
pos+=t; //移动
}
if(pos+s<len)
is_change |= Merge(arg,pos,pos+s,len , Comp);
}
if(ps+s<len)
is_change |= Merge(arg,ps,ps+s,len , Comp); return is_change;
} int main( int argc , char * argv []){
int process_id , num_process;
MPI_Init( & argc , &argv);
//make process_id = 0 to master; other slaves
MPI_Comm_size( MPI_COMM_WORLD , &num_process);
MPI_Comm_rank( MPI_COMM_WORLD , &process_id);
assert( num_process == 4 );
int recv_buf [4];
int brr[16];
unsigned int part_size=(sizeof(recv_buf)/sizeof(recv_buf[0]));
//init
if( 0 == process_id ){
int arr[] = {3,11,6,16, 8,1,5,10,
14,7,12,2, 4,13,9,15};
int len =sizeof(arr)/ sizeof(arr[0]);
memcpy( brr , arr , len* sizeof(arr[0]));
}else{
int len =sizeof(brr)/ sizeof(brr[0]);
memset(brr,0, len* sizeof(brr[0]));
} int epoch=0;
while( epoch < 5 ){
if( 0 == process_id){
//div part len( brr )/ num_process
part_size = (sizeof(brr)/sizeof(brr[0]))/num_process;
//send
for (int i = 0; i < num_process; ++i) {
MPI_Send(&brr[i*part_size] ,part_size ,MPI_INT ,i,i,MPI_COMM_WORLD);
}
}
{
//work calc MPI_Recv(&recv_buf ,part_size,MPI_INT ,0 ,process_id,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
if( epoch&1 ){
Msort_(recv_buf, 0, sizeof(recv_buf) / sizeof(recv_buf[0]),Greater);
}else{
if (process_id & 1) {
Msort_(recv_buf, 0, sizeof(recv_buf) / sizeof(recv_buf[0]), Less);
} else {
Msort_(recv_buf, 0, sizeof(recv_buf) / sizeof(recv_buf[0]), Greater);
}
}
MPI_Send(&recv_buf ,part_size ,MPI_INT ,0,process_id,MPI_COMM_WORLD); }
//recv
if(0 == process_id) {
std::cout << "start epoch: " << epoch << std::endl;
//recv
for (int i = 0; i < num_process; ++i) {
MPI_Recv(&brr[i * part_size], part_size, MPI_INT, i, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
for (int j = 0; j < 4; ++j) {
std::cout << " " << brr[i * part_size + j];
}
std::cout << std::endl;
}
//check 数组是否需要停止 //调整数组
if( epoch+1<5 ) {
for (int i = 0; i < 4; ++i) {
for (int j = i; j < 4; ++j) {
int tmp = brr[(i * part_size) + j];
brr[(i * part_size) + j] = brr[(j * part_size) + i];
brr[(j * part_size) + i] = tmp;
}
}
}
}
epoch++;
} if(0 == process_id) {
std::cout<<"---------------------------"<<std::endl;
for (int j = 0; j < 4; ++j) {
for (int i = 0; i < 4; ++i) {
std::cout << brr[j*4 + i] << " ";
}
std::cout << std::endl; }
}
MPI_Finalize();
return 0;
} //

结果:


demo_mpi mpirun --mca btl_vader_backing_directory /tmp --oversubscribe -np 4 shear_sort
start epoch: 0
3 6 11 16
10 8 5 1
2 7 12 14
15 13 9 4
start epoch: 1
2 3 10 15
6 7 8 13
5 9 11 12
1 4 14 16
start epoch: 2
1 2 5 6
9 7 4 3
8 10 11 14
16 15 13 12
start epoch: 3
1 8 9 16
2 7 10 15
4 5 11 13
3 6 12 14
start epoch: 4
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
---------------------------
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13

并行排序ShearSort ---[MPI , c++]的更多相关文章

  1. 《并行程序设计导论》——MPI(Microsoft MPI)(6):并行排序算法

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  2. 选择排序的MPI实现

    #include "stdafx.h" #include "mpi.h" #include <stdio.h> #include <math. ...

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

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

  4. MPI简介

    什么是MPI: MPI是一个库,而不是一门语言.但是按照并行语言的分类,可以把FORTRAN+MPI或者C+MPI看作是一种在原来串行语言基础上扩展后得到的并行语言.MPI库可以被FORTRAN77/ ...

  5. 普林斯顿大学算法课 Algorithm Part I Week 3 排序的应用 System Sorts

    排序算法有着广泛的应用 典型的应用: 排序名称 排序MP3音乐文件 显示Google的网页排名的搜索结果 按标题顺序列出RSS订阅 排序之后下列问题就变得非常简单了 找出中位数(median) 找出统 ...

  6. JDK8中的并行流

    1.IntStream.parallel():获取并行流处理 2. Collection中调用parallelStream()获取并行流 3.并行排序Arrays.parallelSort()

  7. 【转载】双调排序Bitonic Sort,适合并行计算的排序算法

    双调排序是data-independent的排序, 即比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU.fpga来计算. 1.双调序列 在了解双调排序算法之前,我们先来看看什么是双调序 ...

  8. Java 8新特性之 并行和并行数组(八恶人-8)

    Jody Domingre 多莫歌·乔迪 “How you doing, dummy?” 你还好吗,傻瓜 一.基本介绍 Java8不仅增加了Stream,而且还增加了parallelStream(并行 ...

  9. [PHP] 排序和查找算法

    知乎:冒泡排序(bubble sort)的原理是什么? 潘屹峰: 冒泡排序的原理可以顾名思义:把每个数据看成一个气泡,按初始顺序自底向上依次对两两气泡进行比较,对上重下轻的气泡交换顺序(这里用气泡轻. ...

随机推荐

  1. MATLAB的一些使用的快捷键整理

    1.用TAB键可以实现缩进,怎么缩进和取消缩进呢? 在使用脚本编写matlab的程序时,我们通过选中需要的程序,按下tab键就能缩进整个程序.同样的,当我们需要取消缩进时,我们的快捷方法就是:shif ...

  2. gdb调试若干问题

    1.若干命令速查 file <文件名>:加载被调试的可执行程序文件.因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径.示例:(gdb) file gdb-sample r ...

  3. Dev-C++安装第三方库boost

    Dev-C++安装第三方库boost  转 https://www.jianshu.com/p/111571e4d6f5?utm_source=oschina-app 之前鉴于codeblocks界面 ...

  4. Codeforces 1131F Asya And Kittens (构造)【并查集】

    <题目链接> 题目大意:有$n$只小猫,开始将它们放在指定的n个单元格内,然后随机从n-1个隔板中拆除隔板,最终使得这些小猫在同一单元格.现在依次给出拆除隔板的顺序,比如:1 4 就表示1 ...

  5. ssh centos 上传文件

    ssh centos 上传文件命令(ftp开不起的情报况下): rz -be 下载文件: sz

  6. vue cli3.0 结合echarts3.0和地图的使用方法

    echarts 提供了直观,交互丰富,可高度个性化定制的数据可视化图表.而vue更合适操纵数据. 最近一直忙着搬家,就没有更新博客,今天抽出空来写一篇关于vue和echarts的博客.下面是结合地图的 ...

  7. spring_AOP

    例子代码 理解AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.大概意思就是在原有源代码的基础上,增加功能,而又不修改原有的代码. 术语 切面(Aspe ...

  8. c++ <vector>学习

    https://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html 具体参考上面博客,很详细,也是看他的.今天c++学习200%,项目开发0% ...

  9. windows系统 webstorm安装zencoding方法

    今天在webstorm安装zencoding,下载地址:http://code.google.com/p/zen-coding/downloads/list,下载以下文件: WebIDE and In ...

  10. Alpha(4/10)

    鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...