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