From 0dd5d385ccb8483a6d17a401c8ed55ac2a45a8a7 Mon Sep 17 00:00:00 2001 From: 13513022 <13513022@hpc.if.itb.ac.id> Date: Fri, 19 Feb 2016 15:18:40 +0700 Subject: [PATCH] Implement sorting with OpenMP --- bucketsort | Bin 0 -> 15933 bytes bucketsort.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100755 bucketsort create mode 100644 bucketsort.c diff --git a/bucketsort b/bucketsort new file mode 100755 index 0000000000000000000000000000000000000000..6a1dd441d87f5d73ef381536b08bfff4cf258ac3 GIT binary patch literal 15933 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 Z@X;k4&^MU$d81=-nD+p_*}AZh{{ftIbZr0t literal 0 HcmV?d00001 diff --git a/bucketsort.c b/bucketsort.c new file mode 100644 index 0000000..3d9376b --- /dev/null +++ b/bucketsort.c @@ -0,0 +1,130 @@ +// Copyright www.computing.llnl.gov +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <omp.h> +#include <assert.h> + +int *create_rand_nums(int num_elements) { + int *rand_nums = (int *)malloc(sizeof(int) * num_elements); + assert(rand_nums != NULL); + int i; + for (i = 0; i < num_elements; i++) { + rand_nums[i] = rand() % num_elements; + } + return rand_nums; +} + +void insertion_sort(int *array, int num_elements) { + int d, c, temp; + for (c = 1; c < num_elements; c++) { + d = c; + while (d > 0 && array[d] < array[d-1]) { + temp = array[d]; + array[d] = array[d-1]; + array[d-1] = temp; + d--; + } + } +} + +int main(int argc, char *argv[]) { + if (argc != 3) { + printf("Usage: bucketsort thread_counts num_elements\n"); + exit(1); + } + + int i; + int thread_counts = strtol(argv[1], NULL, 10); + int num_elements = atoi(argv[2]); + + time_t time_count; + + int bucket_range = num_elements / thread_counts; + int bucket[num_elements]; + int count[thread_counts]; + int iterator[thread_counts]; + int bucket_index[thread_counts][2]; + + // Buat elemen randomm + int *rand_nums = NULL; + rand_nums = create_rand_nums(num_elements); + + // Timer + time_count = clock(); + + + // Inisalisasi buckets + for (i = 0; i < num_elements; ++i) { + bucket[i] = -1; + } + + // Inisialisasi count + for (i = 0; i < thread_counts; ++i) { + count[i] = 0; + iterator[i] = 0; + } + + // Inisialisasi index + for (i = 0; i < thread_counts; ++i) { + bucket_index[i][0] = -1; + bucket_index[i][1] = -1; + } + + // Hitung ukuran yang akan dimiliki oleh setiap bucket + for (i = 0; i < num_elements; i++) { + count[rand_nums[i]/bucket_range]++; + } + + // Hitung index bucket + int lastIndex = 0; + for (i = 0; i < thread_counts; i++) { + if (count[i] != 0) { + bucket_index[i][0] = lastIndex; + bucket_index[i][1] = bucket_index[i][0] + count[i] - 1; + lastIndex += count[i]; + } + } + + // Masukan elemen ke dalam bucket + for (i = 0; i < num_elements; i++) { + int num_bucket = rand_nums[i] / bucket_range; + bucket[bucket_index[num_bucket][0] + iterator[num_bucket]] = rand_nums[i]; + iterator[num_bucket]++; + } + + // debugging purpose + // for (i = 0; i < num_elements; i++) { + // printf("%d\n", rand_nums[i]); + // } + + // for (i = 0; i < thread_counts; i++) { + // printf("size: %d\n", count[i]); + // } + + // for (i = 0; i < thread_counts; i++) { + // printf("index first: %d\n", bucket_index[i][0]); + // printf("index last: %d\n", bucket_index[i][1]); + // printf("\n"); + // } + + // for (i = 0; i < num_elements; i++) { + // printf("%d\n", bucket[i]); + // } + + #pragma omp parallel num_threads(thread_counts) + for (i = 0; i < thread_counts; i++) { + if (count[i] != 0) { + insertion_sort(bucket + bucket_index[i][0], count[i]); + } + } + + // for (i = 0; i < num_elements; i++) { + // printf("%d\n", bucket[i]); + // } + + float final_time = (float) (clock()-time_count) / CLOCKS_PER_SEC *1000; + printf("Time : %f ms\n", final_time); + + return 0; +} \ No newline at end of file -- GitLab