Skip to content
Snippets Groups Projects
Commit 78d6cefe authored by Feryandi Nurdiantoro's avatar Feryandi Nurdiantoro
Browse files

Porting OpenMPI Bucketsort to OpenMP

parent 729bc0e6
No related merge requests found
#include <omp.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
typedef struct Bucket {
int num;
int* content;
int size;
} Bucket;
int *intdup(int const * src, size_t len)
{
int * p = malloc(len * sizeof(int));
memcpy(p, src, len * sizeof(int));
return p;
}
int *createArray (int num_elements) {
int *rand_nums = (int *) malloc(sizeof(int) * num_elements);
int i;
srand(time(NULL));
for (i = 0; i < num_elements; i++ ) {
rand_nums[i] = (rand() % 100);
printf(":%d ", rand_nums[i]);
}
printf("\n");
return rand_nums;
}
int searchMax (int *array, int size) {
int max = 0;
int i = 0;
for (i = 0; i < size; i++ ) {
if ( array[i] > max ) {
max = array[i];
}
}
return max;
}
Bucket* createBucket (int* array, int max_num, int array_size, int process) {
int total_bucket = process;
Bucket *buckets = (Bucket *) malloc(sizeof(Bucket) * total_bucket);
int content_size = (max_num / total_bucket) + 1;
int i = 0;
for (i = 0; i < total_bucket; i++) {
int *temp_bucket = (int *) malloc(sizeof(int) * array_size);
int n = 0;
int l = 0;
for (n = 0; n < array_size; n++) {
if (( array[n] >= i * content_size ) &&
( array[n] < (i * content_size) + content_size )) {
temp_bucket[l] = array[n];
++l;
}
}
buckets[i].num = i;
buckets[i].size = l;
buckets[i].content = intdup(temp_bucket, l);
free(temp_bucket);
}
return buckets;
}
int *insertionSort(int *array,int n){
int d,c,t;
for (c = 1 ; c <= n - 1; c++) {
d = c;
while ( d > 0 && array[d] < array[d-1]) {
t = array[d];
array[d] = array[d-1];
array[d-1] = t;
d--;
}
}
return array;
}
void printBucket (Bucket b) {
int i = 0;
printf("print: ");
for (i = 0; i < b.size; i++) {
printf("[%d]", b.content[i]);
}
}
void printArray (int *array, int size) {
int i;
for (i = 0; i < size; i++) {
printf("[%d]", array[i]);
}
}
int thread_count = 0;
int array_size = 0;
Bucket *buckets = NULL;
int *array = NULL;
int main(int argc, char *argv[]) {
thread_count = strtol(argv[1], NULL, 10);
array_size = atoi(argv[2]);
// Ini kalo proses utama jadinya dia yang bikin masalah trus disebar
// ke proses lainnya buat diselesaikan
// Bikin masalah
array = createArray(array_size);
int *sorted_all[thread_count];
int sorted_size[thread_count];
// Bikin bucket buat memecah pecah masalah jadi lebih kecil
buckets = createBucket(array, searchMax(array,array_size), array_size, thread_count);
//printBucket(buckets[0]);
#pragma omp parallel num_threads(thread_count)
{
Hello(&(*sorted_all), &sorted_size);
}
int i = 0;
for (i = 0; i < thread_count; i++) {
printArray(sorted_all[i], sorted_size[i]);
}
return 0;
}
void Hello(int **sorted_all, int *sorted_size) {
int my_rank = omp_get_thread_num();
int thread_count = omp_get_num_threads();
int *sorted = insertionSort(buckets[my_rank].content, buckets[my_rank].size);
sorted_all[my_rank] = intdup(sorted, buckets[my_rank].size);
sorted_size[my_rank] = buckets[my_rank].size;
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment