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