From 572ae465b357fd0b82d5371cec7f44ecc068496a Mon Sep 17 00:00:00 2001 From: 13513080 <13513080@ld5-01.if.itb.ac.id> Date: Fri, 12 Feb 2016 17:27:15 +0700 Subject: [PATCH] add bucket feature and final report --- bucket | Bin 0 -> 13292 bytes bucket.c | 154 +++++++++++++++++++++++++++++++++++++++++++++ laporan_bucket.txt | 24 +++++++ mpi_hostfile | 7 +++ scattergather | Bin 0 -> 13684 bytes scattergather.c | 78 +++++++++++++++++++++++ 6 files changed, 263 insertions(+) create mode 100755 bucket create mode 100644 bucket.c create mode 100644 laporan_bucket.txt create mode 100644 mpi_hostfile create mode 100755 scattergather create mode 100644 scattergather.c diff --git a/bucket b/bucket new file mode 100755 index 0000000000000000000000000000000000000000..6c0a534a1f9ffbf8abe87342dc1171f7abdf44fe GIT binary patch literal 13292 zcmeHNeQ;FQb-%mIhxo80FmW(o^O_0|xM2~PfCTwi0S}(&f++}xbik`cyFzPLyYha3 zAULJj$o1>8iITw`Idy8r^`y+?k20;v;NS!a7^Kd4CL(oGGEq}a0`4x5spDXb-6rbq z+;`9J+o#=5W;*R(+?n^zJ->U-x#ykx@xIQV>Hf`bmrHPQi_Z$;+GqMCWSxZ=`2)!+ ztVzreKJlnnD5e3Kio+*ch*~wK_mpX-HA>C{It53Q+X9;0K3QS9$btn^_K+y`S1LYL zwP@SNES9MdngmFXd>ws6vY_p<!t}E8<JwHCo%IMNy}Z)PD?O(5N{=aDA6*+AZK}P^ z?E^==kBHbL&m~H-RCe4*g{Z!1o@7CNvchz=1q-IE_b1RJKY!oCe(qHLRf|ib@}DV> z!-{BR|C-e+qM_x{NG#pEytir1@-?fy$+&lwyzY89Lb6-7@0Koc95ry{GhH6d0c!uF zj`yDJJgXi3!XM9k{gt0KpVUt8JWp*8;^1)`82p4wY~C<~u!nFwjAMiT<J;?64xB&# z%WoX(pS9=iwP*J%dL#Gi+MECUAGMLOrJWF|T58dvRcQSpu(=iR)o`Q|o~<I^Tt)uX zD)M)#;QlIheqKfXao`#bXVI(Jc?p7*uB*EW-V9vB;Vet4*xv?0%_$82DvnD1`l{G@ z8hE{!FHUOhW!Am}ZVqO{sRo6s`TDGse^{JeS}y;6mS;O^0fm*k)BXX-&lR&o(+nSK zrP7D$Tv01tf6!L~QTuls(x1oLEnN8{uwJ@*BD6qOt`dRPwrzn>I1xS&Nv6Vywrv}u z@mRPmxIY>efxv<8cr1`i1rw=2Km@iP3hY#J8>7KwGMu#3D=SB0k(AiBqcyNG-rXHY zMvjIh_xV($8>TzaTxv}OV+SSI%1S%K9fw35eg^1B$C8l)v2dt_bdb@*@kBHv^)^Rh z!6<jJD;%>)Mq-v5Tf(V8Pa@tCPA21tKr9F^5Q&~tS0Wq?Q8XHf@1WWmTzVuK?`Uog zBs+q!PSKN2B}GpHraA?D4T<hxG#c-K7^$cTbq6Cc5eSEZsURBmCzBQq2ns9WJt-XF z7%qo)EV0Gkx?y8rm3M8iw#xe{YoLUnp|Xa{ezx{0YQYpyhf7k@a{*r{=MHf~d^{3) zfHeL>Vd({t8KnDlQbxJAxLs1(tBbc9)K97TNcT3{-?;F+CY<(6E~nJ|B76aZp!1cT z>8SJ6qh`&9dk9cvsSW3Q2{kp^aO#6glMT1uZ+teK`sQNTaK7hI+YTF!02Rv~8*YzJ zyA7XJloq1PhR?R)JvJNzQY^hTysn4}aomQ_vEeV+aQl8`WNz0O*{NqA(uC1Bn3|gZ zTPPWs%Qcs5%BW6!>Q#tLEO`y*y2U=!i0>ky!uSNrl5Y}Ev!gI7`EL+ULsuA-{9h99 zA^wcyzf3$0RpFH6j}lKqROpv{f_NI5!g0wzLp%*hp-1xjiKn3`v`hX^iKihb?2!CU z;wkh6pX9d^Pa!WfN`3?J6zYN|`E|rohzs?SUqw9KUJC;J%3rmbSD!Y_Ul^I|@9t=8 z9UeS`9n%;d(j*!7&+>`<76{(y?5Fsgdj$dCZ7d%EF*5gR4fDof_r6Q#U{416&b|xO zG%;Sc_&8zbh-3ModmhLe=0#)Z=I0F8s9|0)uKq3!{qK>i(f6Yi>;FROAOFltk7z=q z=j?`N{!4IV-<7G)19JW568U3fK67p^1X2r&F3j0|VH{6^ke?XcSNI}S3Wsp&>?aeu zj6c6k&${OKKl!_f3Bx?Af&74azd)z_%Y^3o_Q=L77f!+Z{D6hg@W5jWyYpL;dvUMT z)Goz;Vwl7ES*T|FNVadVu5UL6{=z6ing2(r&=*xk3c#et`K?kx;seIexSNbjllJs8 z!}@LV>eh;^e%lx@a`XC#HM05{Be%$%UqPxlQZ+9QeYE(456w~2lhJRxva+9M{r0gd z`Nz@mdv$aA=9A5=MNIuP8OaJ$zs8lfxwGix&RnBev0lHHe7JHGtW<7TufKh$s?OWx zo|;)J>ct?qC}O65YFN+H^1JnDR?n9O;S{FOFa<<pAY!RE>-l5<0u4e7XK=FMOx|Vo zEv0bjZ_By%!CB%={pDeOl&lZyZ;?t?f7#T>ZnZkQI)kn#1Y?IAvij&GFS7NSi!QSs zMx>{6GcXEME`2Pkk5Lf*KJ(mLuJmF{7tYv*lCDDOTbDuOiOZ-v(SiyFMVf4O2Kbbb z`?MQi%NsODTjX3ahrUPmoga`!{?-4Sn6M&DlbPnin;e%Lbfq%dRpT-+tdCf6xopK{ zfa20oJuaV}+$0?wVF$??IoQAsy5Qijepy}~A~u4E4U{7GV&=KauJpRBK9bvkQIjJ- zyEOe><#w-@?9%%A_D6K>G$)F|oGpVnNEb7#ziAN}+QNT<nH*gjZ;Z2AkZBmiT<otX z*O=XX8>^__$mM*r$jsRde9?5DFfHfEub+Pizn&Wu=}C)1&H^mQ!C`%joV&FZGsiYd z`sD<~oy?on-z=Mdn3@-*Y%w~J9l_FeXY@B+8GQ_KE#Ew>zGyQ4b=d@|JMli;&wqHY z(uVQEus$vwg9GDE2QYzwVsCu6xUKyXRx<i{aR|nb4Zl}cufOnK-Cq6lg?hX;pOe${ zJmjolg8CAIsh9j~5~i68_=zH%16-hCGt6<rykzA1nkeGA7p=h0D+Zp7yg{eZil715 zC(TNoj!`3X(`A^ukIP~97`YwO&(UkKLF*GYr{TVO*e1lfJAH7Lc;nz;y|L`Fk=xWz zV`K)W8$)>yW(jU=eZ6vuU8i1e?S^ZguIw6JwsMWv0=aha0}2G`n1hBngsqzFWp`gU zI(~#HHJZ_{BbelRvwr;;cExcrRCom^ioKq{6)5WDNhdpH)a*-<4Ly%Fq#9+*?9p;j zn74$oQUL)eI>5bm=UtiS^5RS0a?LDj+RaZHHJXR&zTAzzttmiWBdY85@w(iT<k49< z1lA?m*Gefa6q0|tORH%tzZRjfZtvNB_x|Zpr?+nLS8&-vboLu&wBefH3^j}!x#fR1 zQxpE&k^vCI+}kkfM`PY^rW)S$o5vdN;hC_>zwAbfInip~HHLocX*GYm@@M(0@1vK# zU!@k%^Mv2L={N6gGACLl=8YMdOD?1NR{Exq-HXxAMjPt=*-*oLKWdskn`&6<&mL=N z#A9U>9!8FnN58oQpXk|BJ!;bXhrQ@AyiaPeboYLcc&8SQhP%TtyhkkwNiidsj6}6v z@kA;TJD^2kp>VIZTw4;-*3oIEh@`YsJbqAH(y1lG9r0Kw32?hKmsBD<tk=0PcuU8% z(6hb~)~DiFgo`~!6ruHl)*!U6fsSE>=nhExC4KAQcNy2wox;^y?^-x}dQHD;dOhKb zaE!nXeaqldSzd?+2$1~1orwwgQdV2Pxpw~6x><*7j*HJNSpWDF4WA$zB)192UidXa zPs1&>_0PLEJ}}M5cs%E)qjz8^Bp1a|L+gZqt<O(8F}1VSmzkcM@>S2*-0nTKBuf6A z#L)w}@(}=dzub?&{RrHT!2Jl^kHGy1+>gNjV+1sOPm_hI>YJYBsW|B@1u#zEvZ?U5 z(L;)V#DWF$vlY+(Mfe*l{||Xswe$bgg^E{?S;cSG*VO-1dWNII?RZm+6F=bg5h?!j z?V4)w{Ox(%ZSnlA_*=?f`d~?AzD0!kEvz{HrVkb$H>mJ4oct0Co}V}AQIX2WEh0vz z`(%yr9>ufY?MiNjqTD|o6Xo^zlsq1TCC_nxSMk$SyHfu@C;T7V+0mgHJ_$Xq=wB)N zZAHJU=oLkOqUbw{-c@wkOv}zgiaw_38bvoN`jn#7>6VQf*J(@fXLy;m+Pl`fN?X;q za@ER}jm_H9o#BvX1XC8iylI&b-sF+)RB%6NDq+zsuHnZ~IME}#v3M%%ZQ0PeJQX~k zxC61YcYiv9-`A0l@DkS*Om+!x=tvCqESgGKEr-I1WF#IdV*+SPgrh-HP_>?DN_ge( zH*YH3i@N;T=1s)quPJZ1E6|z1@2@~t2)fK!8i8OU5j<jPaQ&GMh{1ZWJJNx!<1mPm zSN39A#J?`#r9X0bzmsG2zd6zRq`AoJpvmn6SIW=e^(jG|c-}Jqhp5n+VEs0?4_qn# zL6cnRG^JFPwUs#A^;2%2#8b*3y_eaGQ-2d0@oE?6{(0XRPyn@4nQD>ZKBHK%9hF%) zSbyB@11H3|0$xy*_8q$R8frx0_5Bp;9vrOC`;`1M1Dy9IRAq6-?`fd4C$K*61Jl$- zvqtH$|18J!Alhk<VV?IHpVFuIb1F{%EmVl3s8CE<pZB#MrQfauxqs*Nf5oBC`{bz7 z=Y5s*>E7Yg|0*zw3GeHCUujYs=>oLb3;Aj<CK$VZyV`%+c_VfNoIblzVR{nvGJUll zwW}LT8{3guB|XK8Z#wk(KKME%te`m5Wvs0h>wF4?`ser$;zK8uL8VXewHJ;bW2aHE z>vO&k=Mk-DK}DVM`>sR37oS9_^v;t+j9H|3cJ@Dr7W(N&Yk&&h_c^b~DevUpf(|`% zus%N*TvHDoPI)JP4Z3vwtWSUFsEq%f`u_@9ntQCz_eIY8;`}b2pWHvspLd{Z@1Otk z-&>3Z6qdKR63_T8G}!g|xkPA|Mn5Ym%6d%i0JrP+Ywc39Uz23gd~=TfM-U@heEsy( zhssG!5>dk)SuDGyIP6`hQU8ra#Hz6VCmlG+Qeip=b?#d>sMDZkRccsJ;SN^X;kBbg zBr%p*+;O!J(R5gjgD;2oZ(5&~`X5mj)Zl1z_HXr4`RsvrO>W<$Mh{kdTSeR>QWfzj z#phwWF%Rx);}zwnAv3^d7nOC7m@fGKVsG>yDtzB4$7cw>AC%)Wi_gR5_~d*kYWHC0 z=Y6?c{()k?X*oVQzsj;xhkem!7nOAnc5~kM?2R5|WbuAhj?XRbQ|0)Bg7=?td>;0b zb~_~N9=u)feqnF)Ad`ppfpQ#g6KZ{x<MRct+j1QFZ58F6cSUPGO%cDQ<ycnep6kL} zjnjX6Pjib0ME^`*nY>rwgATk!;bK;~{O5tYC=YLGJ8GqM-6`vn<Cz0a{TAO>NeSg8 z94=(m@%=-BIGw{$>AGkgR>FsXyD;uMKITKMRDOtRr8tm8B|ATps&gmJhuhN5<Z*vr z$vge0{mVsfk&bbE6!=`kfwE$#@E+y`F7pUkUTxSLfNN5+{6zVY8lFa-^Ctq_p0~tW z$trjs@Je}>CxBPVv-}%rXYx9It&07BsDfXqg8#4z{!SHqDgs#PdTW8xbvfg+5O}3{ zJ`Q}2yH1Qa_L;SW<4I*u;d~$644lSMQ@E)D{glKx>LvP&w1f5XSi1#+r*gQ8{Bhv* zSYOV3);=jedH+12<emAf^gcv>Qr;C6`7aFgTN0O0+37pLwKBwFE>w~KDeyV&`GV52 z?BzxkJM{Cc(s<4G5I*@nGFReu%c|ayNF`J0&Q34ohi=`tGvIIC)rS1pQkHEX)g9=d zJlmw;+*unG2!!H+1JU^YU^Ea)#S_UuFx@NgdfgKZr@|rcnw3wih2;uDGON~lZAa2+ zDse<uFZ!W$clQyf*th_FA1D*upYAvqPD!UX?`+wo2lVZmDC<{V0@us5LL#u~3)@?^ zwQhuztwkmbi@+BDlN(z6fhRX_-lew%+FCaFbuuS2W;>E;D+Rci;%iIj{hxA@>4SsH ztEJpxE1Q_obA3L}sHHqwm4;iiUQ8galz40<_LdtU<1z=CDiu<PCuROlR+nkW7^jlQ z&V=efC>alQA)lC%ty`bOb%i3aKst#;XIq@)mmDkMxV)3%)p3e*D`ij1bYo6EwxuD< u^yKn<?1~xPWtq>V4r$6EJDg_)rH%94ElV1w9*Wu6a#qNU>5?HDp8p2jieRPy literal 0 HcmV?d00001 diff --git a/bucket.c b/bucket.c new file mode 100644 index 0000000..33448cc --- /dev/null +++ b/bucket.c @@ -0,0 +1,154 @@ +#include "mpi.h" +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <time.h> +#include <assert.h> + +int main( int argc, char* argv[] ) +{ + double starttime, endtime; + int proceso_id; + int num_element; + int m; + int i,d,li,c,t; + unsigned int j; + char processor_name[MPI_MAX_PROCESSOR_NAME]; + int namelen; + int numprocsused; + // Intiating parallel part + MPI_Status stat; + MPI_Init(NULL,NULL); + + MPI_Comm_size(MPI_COMM_WORLD, &numprocsused); + MPI_Comm_rank(MPI_COMM_WORLD,&proceso_id); + MPI_Get_processor_name(processor_name, &namelen); + unsigned int receivedElement; + if(proceso_id == 0) { + // if it is main process + printf("Enter number of elements\n"); + scanf("%d",&num_element); + unsigned int *n = malloc (num_element * sizeof(unsigned int)); + for (i= 0; i < num_element; i++){ + n[i] = rand() % num_element; + } + + // starting time calculation of the sort + starttime = MPI_Wtime(); + + // min and max values are got + unsigned int min = n[0]; + unsigned int max = n[0]; + for(i=0; i < num_element; i++) { + if(n[i] < min) { min = n[i]; } + if(n[i] > max) { max = n[i]; } + } + + // calculating how many numbers each bucket/process will get numbers + int *elementQtyArray = malloc (sizeof(int) *numprocsused); + // default values + for(d=1; d < numprocsused; d++) { + elementQtyArray[d] = 0; + } + for(d=0; d < num_element; d++) { + int increaseOf = max/(numprocsused-1); + int iteration = 1; + int pridetas = 0; + for(j = increaseOf; j <= max; j = j + increaseOf) { + if(n[d] <= j) { + elementQtyArray[iteration]++; + pridetas = 1; + break; + } + iteration++; + } + if (pridetas == 1) { + elementQtyArray[iteration-1]++; + } + } + + // Sending how many each process/bucket will get numbers + for(i=1; i<numprocsused; i++) { + MPI_Send(&elementQtyArray[i], 1, MPI_INT, i, 0, MPI_COMM_WORLD); + } + + // doing the same, this time sending the numbers + for(d=0; d < num_element; d++) { + int increaseOf = max/(numprocsused-1); + int iteration = 1; + int issiunte = 0; + for (j = increaseOf; j <= max; j = j + increaseOf) { + if(n[d] <= j) { + MPI_Send(&n[d], 1, MPI_UNSIGNED, iteration, 1, MPI_COMM_WORLD); + issiunte = 1; + break; + } + iteration++; + } + if (issiunte == 1) { + MPI_Send(&n[d], 1, MPI_UNSIGNED, iteration-1, 1, MPI_COMM_WORLD); + } + } + //RUSAK + // Getting back results and adding them to one array + int lastIndex = 0; int indexi = 0; + for(i=1; i < numprocsused; i++) { + unsigned int * recvArray = malloc(sizeof(unsigned int)*elementQtyArray[i]); + MPI_Recv(&recvArray[0], elementQtyArray[i], MPI_UNSIGNED, i, 2, MPI_COMM_WORLD, &stat); + + if(lastIndex == 0) { + lastIndex = elementQtyArray[i]; + + } + for(j=0; j<elementQtyArray[i]; j++) { + if(recvArray[j] == 0) {} + else{ + n[indexi] = recvArray[j]; + indexi++; + } + + } + + } + + + // stoping the time + + endtime = MPI_Wtime(); + + + + // showing results in array + for(c = 0; c<num_element; c++){ + + printf("Hasil Sorting index - %d : %d \n",c,n[c]); + } + // sorting results + printf("it took %f seconds \n", endtime-starttime); + printf("Numbers: %d \n", num_element); + printf("Processes: %d \n", numprocsused); + } else { + int elementQtyUsed; + MPI_Recv(&elementQtyUsed, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &stat); + unsigned int *localArray[elementQtyUsed]; + for (li = 0; li < elementQtyUsed; li++){ + MPI_Recv(&receivedElement, 1, MPI_UNSIGNED, 0, 1, MPI_COMM_WORLD, &stat); + localArray[li] = receivedElement; + } + for (c = 1; c <= elementQtyUsed -1; c++){ + d = c; + while (d > 0 && localArray[d] < localArray[d-1]){ + t = localArray[d]; + localArray[d] = localArray[d-1]; + localArray[d-1] = t; + d--; + } + } + MPI_Send(localArray, elementQtyUsed, MPI_UNSIGNED, 0, 2, MPI_COMM_WORLD); + } + + MPI_Finalize(); + return 0; +} + + diff --git a/laporan_bucket.txt b/laporan_bucket.txt new file mode 100644 index 0000000..f71ba67 --- /dev/null +++ b/laporan_bucket.txt @@ -0,0 +1,24 @@ +/*Oleh : Steven Andianto 13513018 dan Luminto 13513080*/ +process 4 +n=50000 : 7.245877 secs +n=100000 : 12.454970 secs +n=200000 : 71.536755 secs +n=400000 : 304.791689 secs + +process 8 +n=50000 : 0.823392 secs +n=100000 : 9.133500 secs +n=200000 : 11.241435 secs +n=400000 : 43.124797 secs + +process 16 +n=50000 : 1.576477 secs +n=100000 : 4.026215 secs +n=200000 : 5.741722 secs +n=400000 : 24.445183 secs + +process 32 +n=50000 : 0.590357 secs +n=100000 : 1.472241 secs +n=200000 : 2.470680 secs +n=400000 : 6.619264 secs diff --git a/mpi_hostfile b/mpi_hostfile new file mode 100644 index 0000000..820eec6 --- /dev/null +++ b/mpi_hostfile @@ -0,0 +1,7 @@ +#daftar host +localhost +167.205.35.26 +167.205.35.28 +167.205.35.29 +167.205.35.30 +167.205.35.31 diff --git a/scattergather b/scattergather new file mode 100755 index 0000000000000000000000000000000000000000..6d2b63c681c93baf2dcdbbabba7eb22906ad9ddb GIT binary patch literal 13684 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 literal 0 HcmV?d00001 diff --git a/scattergather.c b/scattergather.c new file mode 100644 index 0000000..d98db5c --- /dev/null +++ b/scattergather.c @@ -0,0 +1,78 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <mpi.h> +#include <assert.h> + +float *create_rand_nums(int num_elements) { +float *rand_nums = (float *)malloc(sizeof(float) * num_elements); +assert(rand_nums != NULL); +int i; +for (i = 0; i < num_elements; i++) { +rand_nums[i] = (rand() / (float)RAND_MAX); +} +return rand_nums; +} + +float compute_avg(float *array, int num_elements) { +float sum = 0.f; +int i; +for (i = 0; i < num_elements; i++) { +sum += array[i]; +} +return sum / num_elements; +} + +int main(int argc, char** argv) { +if (argc != 2) { +fprintf(stderr, "Usage: avg num_elements_per_proc\n"); +exit(1); +} + +int num_elements_per_proc = atoi(argv[1]); +srand(time(NULL)); + +MPI_Init(NULL, NULL); + +int world_rank; +MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); +int world_size; +MPI_Comm_size(MPI_COMM_WORLD, &world_size); + +float *rand_nums = NULL; +if (world_rank == 0) { +rand_nums = create_rand_nums(num_elements_per_proc * world_size); +} + +float *sub_rand_nums = (float *)malloc(sizeof(float) * +num_elements_per_proc); +assert(sub_rand_nums != NULL); + +MPI_Scatter(rand_nums, num_elements_per_proc, MPI_FLOAT, sub_rand_nums, +num_elements_per_proc, MPI_FLOAT, 0, MPI_COMM_WORLD); + +float sub_avg = compute_avg(sub_rand_nums, num_elements_per_proc); + +float *sub_avgs = NULL; +if (world_rank == 0) { +sub_avgs = (float *)malloc(sizeof(float) * world_size); +assert(sub_avgs != NULL); +} +MPI_Gather(&sub_avg, 1, MPI_FLOAT, sub_avgs, 1, MPI_FLOAT, 0, +MPI_COMM_WORLD); + +if (world_rank == 0) { +float avg = compute_avg(sub_avgs, world_size); +printf("Avg of all elements is %f\n", avg); +} + +if (world_rank == 0) { +free(rand_nums); +free(sub_avgs); +} +free(sub_rand_nums); + +MPI_Barrier(MPI_COMM_WORLD); +MPI_Finalize(); +} + -- GitLab