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