diff --git a/a.c b/a.c new file mode 100644 index 0000000000000000000000000000000000000000..d0d9fdceb1dac55600e9ac954ccaab65b092af0a --- /dev/null +++ b/a.c @@ -0,0 +1,118 @@ +#include <stdio.h> +#include <stdlib.h> +#include <omp.h> +#include <assert.h> +#include <time.h> + +void Hello(void); /* Thread function */ + +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 print_array(int *array, int count) { + int i; + for (i=0;i<count;i++) { + printf("%d ",array[i]); + } + printf("\n"); +} + + +void make_bucket(int *array,int *ar_result,int *num_res,int num_elements, int num_process,int total_process) { + int bagi = num_elements / total_process ; + int batas_bawah = (num_process)*bagi ; + int batas_atas = batas_bawah + bagi - 1 ; + if (num_process==total_process-1) batas_atas = num_elements-1 ; + + int i,num=0 ; + for (i=0;i<num_elements;i++) { + if (array[i]>=batas_bawah && array[i]<=batas_atas) { + ar_result[num] = array[i]; + num++; + } + } + *num_res = num; +} + + +int *sort_array(int *array, int num_elements) { + int i,j ; + int temp_; + int *result = NULL ; + result = array ; + for (i=i;i<num_elements;i++) { + j=i; + while (j>0 && result[j] < result[j-1]) { + temp_ = result[j] ; + result[j] = result[j-1]; + result[j-1 ] = temp_; + j--; + } + } + return result; +} + + +int main(int argc, char *argv[]) { + clock_t start_t,end_t,total_t ; + int thread_count = strtol(argv[1], NULL, 10); + int counter=0 ; + int *flag_array = create_rand_nums(thread_count); + int k ; + for (k=0;k<thread_count;k++) flag_array[k] = 0; + int *rand_array = NULL ; + int *join_array = NULL ; + int num_element = atoi(argv[2]); + rand_array = create_rand_nums(num_element); + join_array = create_rand_nums(num_element); + //printf("Start array : "); print_array(rand_array,num_element); + start_t = clock(); + #pragma omp parallel num_threads(thread_count) shared(rand_array,join_array,flag_array) + { + int my_rank = omp_get_thread_num(); + int thread_count = omp_get_num_threads(); + printf("Process %d now make bucket array \n",my_rank); + int *bucket_array = (int *)malloc(sizeof(int) * num_element); + int bucket_size =0; + make_bucket(rand_array,bucket_array,&bucket_size,num_element,my_rank,thread_count); + printf("Process %d, bucket size %d . Now sorting\n ",my_rank,bucket_size); + //print_array(bucket_array,bucket_size); + //Sorting + int *bucket_sorted = (int *)malloc(sizeof(int) * bucket_size); + bucket_sorted = sort_array(bucket_array,bucket_size); + printf("Process %d finishing sorted \n",my_rank); + //print_array(bucket_sorted,bucket_size); + if (my_rank!=0) { + while (flag_array[my_rank-1]==0) {} + int i2 ; + for (i2=0;i2<bucket_size;i2++) { + join_array[counter] = bucket_sorted[i2]; + counter++; + } + flag_array[my_rank]=1; + } + else { + int i2 ; + for (i2=0;i2<bucket_size;i2++) { + join_array[counter] = bucket_sorted[i2]; + counter++; + } + flag_array[0]=1; + } + } + end_t = clock(); + double total_time ; + total_time = (double)(end_t - start_t) / CLOCKS_PER_SEC; + printf("Total time taken by CPU: %f\n", total_time ); + //printf("Final array : \n"); + //print_array(join_array,num_element); + return 0; +} +