From d4905c5d2dfdd0205081a24d90e6ea12899d4778 Mon Sep 17 00:00:00 2001
From: Aufar Gilbran <aufargilbran@gmail.com>
Date: Fri, 12 Feb 2016 16:30:51 +0700
Subject: [PATCH] Bucket Sort

---
 bucket.c     | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++
 laporan.pdf  | Bin 0 -> 19577 bytes
 mpi_hostfile |   6 ++
 3 files changed, 170 insertions(+)
 create mode 100644 bucket.c
 create mode 100644 laporan.pdf
 create mode 100644 mpi_hostfile

diff --git a/bucket.c b/bucket.c
new file mode 100644
index 0000000..559c3eb
--- /dev/null
+++ b/bucket.c
@@ -0,0 +1,164 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <mpi.h>
+#include <time.h>
+#include <stdlib.h>
+#include <assert.h>
+
+
+int *create_rand_nums(int num_elements, int max_value) {
+	int *rand_nums = malloc(sizeof(int) * num_elements);
+	assert(rand_nums != NULL);
+	int i;
+	for (i = 0; i < num_elements; ++i) {
+		rand_nums[i] = (rand() % (max_value+1));
+	}
+	return rand_nums;
+}
+
+void swap(int *a, int *b) {
+	int c = *a;
+	*a = *b;
+	*b = c;
+}
+
+void sort(int *arr, int arr_size) {
+	int i, j;
+	for (i = 0; i < arr_size; ++i) {
+		for (j = i+1; j < arr_size; ++j) {
+			if (arr[i] > arr[j]) swap(arr+i, arr+j);
+		}
+	}
+}
+
+int main(int argc, char *argv[]) {
+	int send_tag = 0, head_tag = 1, done_tag = 2, root = 0;
+	if (argc != 2) {
+		fprintf(stderr, "Usage: ./bucket [NUM_ELEMENTS]");
+		exit(1);
+	}
+
+	int num_elements = atoi(argv[1]);
+	int min_value = 0;
+	int max_value = num_elements;
+	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);
+
+	double start_time = 0.0, end_time = 0.0;
+	if (world_rank == root) {
+		fprintf(stderr, "Starting root process\n");
+		int i;
+		int *arr = create_rand_nums(num_elements, max_value);
+		assert(world_size > 0);
+		int range = max_value/world_size+1;
+		assert(range > 0);
+
+		fprintf(stdout, "Original Array\n");
+		for (i = 0 ; i < num_elements; ++i) {
+			fprintf(stdout, "%d ", arr[i]);
+		}
+		fprintf(stdout, "\n");
+
+		start_time = MPI_Wtime();
+		int *quantity = malloc(sizeof(int) * world_size);
+		for (i = 0; i < world_size; ++i) quantity[i] = 0;
+		for (i = 0; i < num_elements; ++i) {
+			int index = arr[i] / range;
+			quantity[index]++;
+		}
+
+		for (i = 1; i < world_size; ++i) {
+			MPI_Send(quantity+i, 1, MPI_INT, i, head_tag, MPI_COMM_WORLD);
+			fprintf(stderr, "Sending header %d to process %d\n", quantity[i], i);
+		}
+		fprintf(stderr, "Done sending header\n");
+		int *buck = malloc(sizeof(int) * quantity[root]);
+		int *recv_count = malloc(sizeof(int) * world_size);
+		recv_count[root] = 0;
+		for (i = 0; i+1 < world_size; ++i) {
+			recv_count[i+1] = recv_count[i] + quantity[i];
+		}
+
+		for (i = 0; i < num_elements; ++i) {
+			int index = arr[i] / range;
+			assert(index < world_size);
+			if (index > 0) {
+				MPI_Send(arr+i, 1, MPI_INT, index, send_tag, MPI_COMM_WORLD);
+				fprintf(stderr, "Sending value %d to process %d (%d/%d)\n", arr[i], index, i+1, num_elements);
+			}
+			else {
+				*(buck+recv_count[root]) = arr[i];
+				recv_count[root]++;
+			}
+		}
+		fprintf(stderr, "Done sending array\n");
+		sort(buck, quantity[root]);
+
+		MPI_Status Stat;
+		for (i = 0; i < num_elements; ++i) {
+			if (i < quantity[root]) arr[i] = buck[i];
+			else arr[i] = 0;
+		}
+		for (i = 0; i < num_elements-quantity[root]; ++i) {
+			int el;
+			fprintf(stderr, "Root waiting for messages (%d/%d)\n", i+1, num_elements);
+			MPI_Recv(&el, 1, MPI_INT, MPI_ANY_SOURCE, done_tag, MPI_COMM_WORLD, &Stat);
+
+			int index = Stat.MPI_SOURCE;
+			assert(index > 0);
+			fprintf(stderr, "Received message %d from %d, put at %d\n", el, index, index*range+recv_count[index]);
+			arr[recv_count[index]] = el;
+			recv_count[index]++;
+		}
+		end_time = MPI_Wtime();
+
+		fprintf(stdout, "Sorted Array\n");
+		for (i = 0; i < num_elements; ++i) {
+			fprintf(stdout, "%d", arr[i]);
+			if (i+1 < num_elements)
+				fprintf(stdout, " ");
+		}
+		fprintf(stdout, "\n");
+
+		fprintf(stdout, "Bucket Sort Done in %lfs\n", end_time - start_time);
+		free(arr);
+		free(buck);
+		free(quantity);
+		free(recv_count);
+	}
+	else {
+		int quantity;
+		int i;
+		MPI_Status Stat;
+		fprintf(stderr, "Starting process %d\n", world_rank);
+		fprintf(stderr, "Process %d is waiting for header\n", world_rank);
+		MPI_Recv(&quantity, 1, MPI_INT, 0, head_tag, MPI_COMM_WORLD, &Stat);
+		fprintf(stderr, "Process %d receive header %d\n", world_rank, quantity);
+		int *arr = malloc(sizeof(int) * quantity);
+		for (i = 0; i < quantity; ++i) {
+			fprintf(stderr, "Process %d waiting for value (%d/%d)\n", world_rank, i+1, quantity);
+			MPI_Recv(arr+i, 1, MPI_INT, 0, send_tag, MPI_COMM_WORLD, &Stat);
+			fprintf(stderr, "Process %d receive value %d\n", world_rank, arr[i]);
+		}
+
+		// SORT
+		sort(arr, quantity);
+		// DONE SORT
+		fprintf(stderr, "Sorted array at process %d\n", world_rank);
+		for (i = 0; i < quantity; ++i) {
+			fprintf(stderr, "%d", arr[i]);
+			if (i+1 < quantity) fprintf(stderr, " ");
+			MPI_Send(arr+i, 1, MPI_INT, 0, done_tag, MPI_COMM_WORLD);
+		}
+		fprintf(stderr, "\n");
+		free(arr);
+	}
+
+	MPI_Finalize();
+}
diff --git a/laporan.pdf b/laporan.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..b6a6162bebf7ae75e0beebf99dc6a4c07f95f0b7
GIT binary patch
literal 19577
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
bd6g1v2+@*gw%EgqP$=b;Wa30_4lnr&YWVc>

literal 0
HcmV?d00001

diff --git a/mpi_hostfile b/mpi_hostfile
new file mode 100644
index 0000000..0f5cc5d
--- /dev/null
+++ b/mpi_hostfile
@@ -0,0 +1,6 @@
+localhost
+167.205.35.26
+167.205.35.28
+167.205.35.29
+167.205.35.30
+167.205.35.31
-- 
GitLab