Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
No results found
Show changes
Commits on Source (2)
File added
File added
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <assert.h>
int *create_rand_nums(int num_elements) {
// creating random elements for num_elements
int *rand_nums = (int *)malloc(sizeof(int) * (num_elements+5));
assert(rand_nums != NULL);
int i;
for (i = 0; i < num_elements; i++) {
rand_nums[i] = (abs((int)rand()) % num_elements);
}
return rand_nums;
}
void insertionSort(int *arr, int size){
// sorting an array using insertion sort
int i,j;
int value;
for(i=1;i<size;i++)
{
value=arr[i];
if(value == -1) break;
j=i-1;
while(j>=0 && value<arr[j])
{
arr[j+1]=arr[j];
j=j-1;
}
arr[j+1]=value;
}
}
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-1)*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;
}
void print_array(int *array, int count) {
int i;
for (i=0;i<count;i++) {
printf("%d ",array[i]);
}
printf("\n");
}
int *sort_array(int *array, int num_elements) {
int i,j ;
int temp_;
int *result = NULL ;
result = array ;
for (i=0;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) {
if (argc != 3) { // check the argument
fprintf(stderr, "Usage: ./omp_bucket_sort <number of elements> <number of threads>\n");
exit(1);
}
int num_element = atoi(argv[1]); // number of elements
int thread_count = atoi(argv[2]); // number of threads
srand(time(NULL));
int *rand_nums = NULL;
rand_nums = create_rand_nums(num_element); // creating array with random elements
assert(rand_nums != NULL);
print_array(rand_nums, num_element);
int counter;
time_t start_t;
int *sorted_array = NULL;
int *arr =(int *)malloc(sizeof(int) * num_element);
int *arr_final = (int *)malloc(sizeof(int) * num_element);
int arr_counter = 0;
start_t = clock();
#pragma omp parallel for num_threads(thread_count) shared(rand_nums, arr_counter, arr_final)
for (counter = 1;counter<thread_count;counter++) {
int size_arr ;
make_bucket(rand_nums,arr,&size_arr,num_element,counter,thread_count);
sorted_array = sort_array(arr,size_arr);
int j = 0;
for(int i = arr_counter; i < arr_counter+size_arr; i++) {
arr_final[i] = sorted_array[j];
j++;
}
arr_counter += size_arr;
}
time_t finish_t = clock();
print_array(arr_final, num_element);
printf("Waktu eksekusi %d data : %d process : %.5f ms\n", num_element, thread_count, (double)(finish_t-start_t)*1000/CLOCKS_PER_SEC);
free(rand_nums);
return 0;
}