From 38d44080abbc67a451142dcb8552926796d9e965 Mon Sep 17 00:00:00 2001
From: 13513004 <13513004@ld5-01.if.itb.ac.id>
Date: Fri, 12 Feb 2016 19:29:23 +0700
Subject: [PATCH] udah

---
 mergesort.c  | 113 ++++++++++++++++++++++++++++-----------------------
 mpi_hostfile |   6 +--
 sort         | Bin 13219 -> 13269 bytes
 3 files changed, 66 insertions(+), 53 deletions(-)

diff --git a/mergesort.c b/mergesort.c
index 1185267..aa92d02 100644
--- a/mergesort.c
+++ b/mergesort.c
@@ -1,91 +1,104 @@
 #include <stdlib.h>
+#include <string.h>
 #include <mpi.h>
 #include <stdio.h>
 
-void merge(int* arr, int l, int m, int r, int* tmp) 
+void merge(int* arr1, int* arr2, int size1, int size2)
 {
-  int last = l;
+  int *tmp = (int*) malloc(sizeof(int) * (size1 + size2));
+  int last = 0;
 
   // merge to tmp
-  int i = l, j = m;
-  for (; i < m && j < r;)
+  int i = 0, j = 0;
+  for (; i < size1 && j < size2;)
   {
-    if (arr[i] > arr[j])
-      tmp[last++] = arr[j++];
+    if (arr1[i] > arr2[j])
+      tmp[last++] = arr2[j++];
     else
-      tmp[last++] = arr[i++];
+      tmp[last++] = arr1[i++];
   }
-  while (i < m) tmp[last++] = arr[i++];
-  while (j < r) tmp[last++] = arr[j++];
+  while (i < size1) tmp[last++] = arr1[i++];
+  while (j < size2) tmp[last++] = arr2[j++];
 
   // move to origin
-  while (last > l) 
+  for(int i = 0; i < last; ++i)
   {
-    --last;
-    arr[last] = tmp[last];
+    arr1[i] = tmp[i];
   }
+
+  free(tmp);
 }
 
-void mergesort(int* arr, int l, int r, int* tmp) 
+void mergesort(int* arr, int l, int r) 
 {
   if (l + 2 > r) return;      // base
 
   int m = (l + r) >> 1;
-  mergesort(arr, l, m, tmp);
-  mergesort(arr, m, r, tmp);
-  merge(arr, l, m, r, tmp);
+  mergesort(arr, l, m);
+  mergesort(arr, m, r);
+  merge(arr+l, arr+m, m-l, r-m);
 }
 
 int main(int argc, char *argv[])
 {
-  int n, i;
-  scanf("%d", &n);
-
-  int *arr = (int*) malloc(sizeof(int) * (n + 1));
-  for (i = 0; i < n; ++i)
-  {
-    scanf("%d", &arr[i]);
-  }
-
+  int n = 0, i;
+  
   int world_rank;
   int world_size;
-  
+
   MPI_Init(&argc, &argv);
   MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
   MPI_Comm_size(MPI_COMM_WORLD, &world_size);
 
-  int size = n / world_size;          // equally distributed
-  
-  int *arr_part = (int*) malloc(sizeof(int) * size);
-  MPI_Scatter(arr, size, MPI_INT, arr_part, size, MPI_INT, 0, MPI_COMM_WORLD);    // scatter to buckets
-  
-  int *tmp = (int*) malloc(sizeof(int) * size);
-  mergesort(arr_part, 0, size, tmp);
-  
-  int *sorted = NULL;
-  if(world_rank == 0) {
-    sorted = malloc(n * sizeof(int));
+  if (!world_rank) scanf("%d", &n);
+  int size = (n + world_size - 1) / world_size;          // equally distributed
+  int N = size * world_size;
+
+  int *arr = (int*) malloc(sizeof(int) * N);
+  memset(arr, 127, sizeof(int) * N);
+  if (!world_rank) {
+    for (i = 0; i < n; ++i) scanf("%d", &arr[i]);
+  }
+
+  world_rank++;   // 1-based
+  MPI_Bcast(&size, 1, MPI_INT, 0, MPI_COMM_WORLD);  
+  MPI_Scatter(arr, size, MPI_INT, 
+              arr, size, MPI_INT, 
+              0, MPI_COMM_WORLD);    // scatter to buckets
+
+  mergesort(arr, 0, size);
+
+  int x = 1;
+  MPI_Status stat;
+  char isSend = 0;
+  while (x < world_size) 
+  {
+    if (world_rank & x == x)
+    {
+      MPI_Send(arr, size, MPI_INT, world_rank + x, world_rank + x, MPI_COMM_WORLD);
+      isSend = 1;
+    } else 
+    {
+      if (isSend) continue;
+
+      MPI_Recv(arr, size, MPI_INT, world_rank + x, world_rank + x, MPI_COMM_WORLD, &stat);
+      merge(arr, arr+size, size, size);
+      size <<= 1;
+    }
+
+    x <<= 1;
   }
   
-  MPI_Gather(arr_part, size, MPI_INT, sorted, size, MPI_INT, 0, MPI_COMM_WORLD);    // gather result
-  
-  if(world_rank == 0) 
+  if (world_rank == world_size)
   {    
-    int *tmp2 = (int*) malloc(sizeof(int) * n);
-    mergesort(sorted, 0, n, tmp2);
-
     for(i = 0; i < n; i++) 
     {      
-      printf("%d ", sorted[i]);
-    }
+      printf("%d ", arr[i]);
+    } 
+    puts("");
       
-    free(sorted);
-    free(tmp2);
   }
-
   free(arr);
-  free(arr_part);
-  free(tmp);
 
   MPI_Barrier(MPI_COMM_WORLD);
   MPI_Finalize();
diff --git a/mpi_hostfile b/mpi_hostfile
index 2441373..068dea3 100644
--- a/mpi_hostfile
+++ b/mpi_hostfile
@@ -1,9 +1,9 @@
 #daftar host 
 localhost 
 #167.205.35.26 
-167.205.35.28 
-167.205.35.29 
-167.205.35.30 
+#167.205.35.28 
+#167.205.35.29 
+#167.205.35.30 
 #167.205.35.31 
 #167.205.35.32 
 #167.205.35.33 
diff --git a/sort b/sort
index 21dd03803e7224f096748d72f4f26a482cdc5cd7..65828fb6fe8ce8d368ef1f1eb2c57df82c1ced10 100755
GIT binary patch
delta 2443
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

delta 2316
zcmZuyeN0<b6u-Bn&=&f|WNl&40__G2C@h&E2I)2#kBw!UZYFbIWvQ^wSj^mqX08N=
zGz8Y|7_%9p5SKaqYphN&eyqqGI{)bsbubeH3!2ub0k=3d&FVR~ufyn0^3J)xbAIpK
zbI-f?-S1l8X$@LTK8>4^Bs60~CyL+IP8o%dO&L$zDCZx5h95U|8xp>5LxS23@9`g&
z=3ac`a@mpBTEAgC-h7&0z4@wtW1|v@CVV(PsrYn<3piW3TtmKj_{@io6;*r*%qSXQ
zozeo;N(;9`yVAw2FsQr^(~6WVBeSqhy9e2GvI+)LT=`F6S|hXmFWQR4OqR}kFq2~D
z-jGIB!$C@YPNkp>a4~g-(<5GG?8WR|8pafCH&uu-Yx4+8#il`Sn%PQaCZ*ru5knPf
zb7)Ok8n^0_F|<Cp$}}7sV4u41sMPVRTIx|9G25AREWBS8-Gd>i<Fa}r@mhT83mA$!
z_oFu0+&Ch<lY+5{IEr&OVJa>b5qJk-T1PA_@Uw)e&9U<WKSel&aDP006cel>2NfI(
z3c_;2w7i&K;2OeIam*+162fZ29)U{;V~<#DoxlZzwS?UQXA@2*Tp@5K;S9odn!ob5
z#=y00QsAc4F*UtzL*r=JgS$o=9ggV9jPA;CvuFdpdAlV@9T+-}P24Dzb)%6wX7y6w
zr-O>EBSV-_wD9)UOB9Mv7;Jv>4G~K6hi8?@mjYi%!@tx?JOZ`a`IUlxQ>OcC0}Jf<
z*-aaf7<~oj-FiiJ0A2jn2u&|_)Se4<YMT@`Kb9$Gjb8XW9`C8Y+!5x|DQS2@Aq7UG
z+u&|SQTiNb50vWi3Kt+#>a7n;fh(8#v99PRe+kE@4;<OBPv_uY!bx3C=KC1zsh^rl
zdKiAx<?z*TPiNz`kgc!Dy>O2x;bURLv36W6Rx!u^8QSzYd<c5=&h(B4#qNgB^yZ@l
z_@2~L{}q)wKQWHdSeqD+(fIyd!HLlL4;&{dK8K7bpb~5UdZeY?VC$qtvzDL~*y|W;
z3V0n8Qg7KEy`44nI-_W$z!pcO34_t5z<$ScQvezb*?bdt4bQK3dhK}pbCi!ii79BC
zsd1_x+9+BN+Hd8#TCjIxh$qp`qLuL5Sa9Qyp>>PX2@8z{+z*XLm&!LAk59l6V<CS8
z28=e|1;a*L{v<YZGo6iPdSjPjg)UY3j3OgV%^c`DgHI7~(;`*yemt%SRhr(;0Jmw2
zrb6q+5dKJDJh!28t(b|iT;XFZiD^TV_|$G;lgHi*>+`mA3k>Gj_yM?<SI4WtWV2;f
zrzLo_Vv^}pSZ*ulVQ912cpsdwy_$1YPW7Q|ugLa$wHxNy*Mz$5rxe@``Gqc%MdcP*
zEOd@h4nQ+{`%>Kk_0efYsepk(mnJNG!!TZ0rJa@$&Y$gg)RZi%TCS@anjJ1pa#21w
z?Wi&Z<vN1&6F`}ON#e+tgAc6EDvcNS8;KV-Ijc-Q8TsUU!3+aVmuBvE7<X1_BQhsq
z2xTwq;`kj07P&NjJR~H37++M!JHc8+dK2pNaJr~YQ(Y{=Y$r?>RcZPw5=aU8#UELd
zO-cCV2yU@Hm?<`6r)P?@lo~cItd><neo2;+?u7LvW*$VHrPLv6N92V;L<U5Ih`I$b
zu?SiCv*aY!+O{|g-dena_X96ATO)EWk~1&Efr9C93ssgj@CrCwx?M40gd3%2xd+<I
z4lYYBGx<UQciF?PwIKR4nVu!vo8-Ta7o?e=5qgNU^}3wlznQ0Cu-x2y3!^55fgO^Y
zp3H+);&qG*mHjDlz<~ZtT)-CjES$vmNwQ=={i{g=LNn%sYc4Z?43?o@DaLD|&1G)f
zAoG)(MW!=4ln=eAWj<X3B;xR*-79h)B5m!GIlrg7iNanMnz0}>S5Qxg^Eq-%3JarO
h{lDd^;7ke5jL3r<K;GU--W`gD!W97?+Pvf?{tta6W~=}J

-- 
GitLab