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
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

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