<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      并行排序ShearSort ---[MPI , c++]

      思想:

      (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  
      
      
      
      posted @ 2018-12-18 16:04  龔細軍  閱讀(1008)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 水蜜桃视频在线观看免费18| 99网友自拍视频在线| 午夜高清福利在线观看| 国产日韩久久免费影院| 国产无遮挡又黄又爽不要vip软件| 国语偷拍视频一区二区三区| 在线精品自拍亚洲第一区| 亚洲高请码在线精品av| 国产熟女真实乱精品51| 狠狠色狠狠色综合日日不卡| 久久精品国产亚洲av高| 国精品午夜福利视频不卡| 国产精品三级爽片免费看| 亚洲欧洲日产国无高清码图片| 随州市| 国产精品污双胞胎在线观看| 公与淑婷厨房猛烈进出视频免费| 熟女一区二区中文字幕| 亚洲av成人午夜福利| 加勒比中文字幕无码一区| 综合偷自拍亚洲乱中文字幕| 黑人玩弄人妻中文在线| 99久久国产综合精品女图图等你| 久久精品人妻无码一区二区三区| 国产精品美女一区二三区| 亚洲国产欧美在线人成| 白嫩人妻精品一二三四区| 美女一区二区三区亚洲麻豆| 四虎在线播放亚洲成人| 野外做受三级视频| 伊人大杳焦在线| 久久婷婷成人综合色综合| 欧美成人午夜精品免费福利| 亚洲精品国产自在现线最新| 扒开女人内裤猛进猛出免费视频| 国产成人亚洲无码淙合青草| 野外少妇被弄到喷水在线观看| 亚洲欧美人成人让影院| 日本不卡不二三区在线看| 久久综合88熟人妻| 国产高清av首播原创麻豆|