From 2e0db1a80fbcbe499ae9dfced9086a075a2c24d1 Mon Sep 17 00:00:00 2001
From: Vicko Novianto <13513092@std.stei.itb.ac.id>
Date: Fri, 19 Feb 2016 11:11:55 +0700
Subject: [PATCH] source code completed

---
 omp_bucket.c | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 143 insertions(+)
 create mode 100644 omp_bucket.c

diff --git a/omp_bucket.c b/omp_bucket.c
new file mode 100644
index 0000000..a850db8
--- /dev/null
+++ b/omp_bucket.c
@@ -0,0 +1,143 @@
+#include <omp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+//global
+int** bucket;
+int* b_idx;
+
+int** getBucket(int* array, int size, int num_p){
+	//find min max
+	int min_idx =0; int min = array[0];
+	int max_idx =0; int max = array[0];
+	int i;
+	for(i=1; i<size; i++){
+		if(array[i]< min){
+			min_idx = i;
+			min= array[i];
+		}
+		if(array[i]> max){
+			max_idx = i;
+			max= array[i];
+		}
+	}
+	bucket = (int**)malloc(sizeof(int*) * num_p);
+	b_idx = (int*)malloc(sizeof(int) * num_p);
+	int bsize[num_p];
+	for(i=0; i<num_p; i++) {
+		b_idx[i] =0;
+		bsize[i] = 0;
+	}
+	int range = (int)ceil((double)(max-min) / (double)num_p);
+	for (i = 0; i < size; i++) {
+		if (array[i] != max) {
+			bsize[(array[i]-min)/range]++;	
+		}
+		else {
+			bsize[((array[i]-min)/range)-1]++;
+		}
+	}	
+	for (i = 0; i < num_p; i++) {
+		bucket[i] = (int*)malloc(sizeof(int) * bsize[i]);
+	}	
+	for (i = 0; i < size; i++) {
+		if (array[i] != max) {
+			bucket[(array[i]-min)/range][b_idx[(array[i]-min)/range]] = array[i] ;	
+			b_idx[(array[i]-min)/range]++;
+		}
+		else {
+			bucket[((array[i]-min)/range)-1][b_idx[((array[i]-min)/range)-1]] = array[i] ;	
+			b_idx[((array[i]-min)/range)-1]++;
+		}
+	}
+	
+	return bucket;
+}
+
+int* insertion(int* array_i, int size){
+	int c, d, t;
+	int* array_insert = (int*)malloc(sizeof(int) * size);
+	int k;
+	for(k=0; k<size; k++) {
+		array_insert[k] = array_i[k];
+	}
+	  for (c = 1 ; c <= size - 1; c++) {
+		d = c;
+		while ( d > 0 && array_insert[d] < array_insert[d-1]) {
+		  t          = array_insert[d];
+		  array_insert[d]   = array_insert[d-1];
+		  array_insert[d-1] = t;
+	 
+		  d--;
+		}
+	  }
+	 return array_insert;
+}
+
+int main(int argc, char** argv){
+	
+	if (argc != 3) { 
+	fprintf(stderr, "Usage: bucket num_elements thread_count\n"); 
+	exit(1); 
+	} 
+	 
+	int num_elements = atoi(argv[1]);
+	int thread_count = atoi(argv[2]); 
+	srand(time(NULL)); 
+	
+	int i, j;
+	double starttime, endtime;
+	
+	//start timer
+	starttime = omp_get_wtime();
+	//get ints
+	int *array = (int*)malloc(sizeof(int) * num_elements);
+	for (i = 0; i < num_elements; i++) {
+		array[i] = rand() % 100000;
+	}
+	bucket = getBucket(array,num_elements, thread_count);
+	
+	int ** array_sorted;
+	int sum = 0;
+	
+	int * curidx = (int*)malloc(sizeof(int) * thread_count);
+	
+	for (i = 0; i < thread_count; i++) {
+		array_sorted = (int**)malloc(sizeof(int*) * thread_count);
+		if (i > 0)
+			curidx[i] = sum;
+		sum += b_idx[i];
+	}
+	curidx[0] = 0;
+	
+	int * result = (int*)malloc(sizeof(int) * num_elements);
+	
+	
+	#pragma omp parallel for num_threads(thread_count) shared(array_sorted, result) schedule(static, 1)
+		for (i = 0; i < thread_count; i++) {
+			array_sorted[i] = (int*)malloc(sizeof(int) * b_idx[i]); 
+			array_sorted[i] = insertion(bucket[i], b_idx[i]);	
+			for (j = 0; j < b_idx[i]; j++) {
+				result[curidx[i]+j] = array_sorted[i][j];
+			}
+		}
+
+	for (i = 0; i < num_elements; i++)
+		printf("%d\n", result[i]);
+	
+	//int * result = (int*)malloc(sizeof(int) * num_elements);
+	
+	//int k = 0;
+	//for (i = 0; i < thread_count; i++) {
+		//for (j = 0; j < b_idx[i]; j++) {
+			//result[k++] = array_sorted[i][j];
+			//printf("%d\n", result[i]);
+		//}
+	//}
+	endtime = omp_get_wtime() - starttime;
+	printf("time : %lf second\n", endtime);
+	
+	return 0;
+}
+
-- 
GitLab