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