diff --git a/bucketsort.c b/bucketsort.c new file mode 100644 index 0000000000000000000000000000000000000000..164f570861807619c16f281f5691a8fc7d116515 --- /dev/null +++ b/bucketsort.c @@ -0,0 +1,111 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <math.h> +#include <mpi.h> +#include <assert.h> + +int *create_rand_nums(int 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){ + 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; + } +} + +int main(int argc, char** argv) { + if (argc != 2) { +fprintf(stderr, "Usage: avg num_elements\n"); +exit(1); + } + + int num_elements = atoi(argv[1]); + srand(time(NULL)); + + MPI_Init(NULL, NULL); + + int world_rank; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + int world_size; + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + + int *rand_nums = NULL; + if (world_rank == 0) { +rand_nums = create_rand_nums(num_elements); +assert(rand_nums != NULL); + } + + time_t start_t; + int bucketSize = num_elements; + int *bucket = NULL; + int * indeks = NULL; + int range = (bucketSize+world_size)/world_size; + if (world_rank == 0){ + start_t = clock(); + bucket = (int *)malloc(sizeof(int) * (world_size+5) * bucketSize); + indeks = (int *)malloc(sizeof(int) * (world_size+5)); + memset(bucket,-1,sizeof(int) * world_size * bucketSize); + int i; + for(i = 0; i < world_size; i++) { + indeks[i] = i*bucketSize; + } + for(i = 0; i < bucketSize; i++) { + int no_group = rand_nums[i]/range; + bucket[indeks[no_group]++] = rand_nums[i]; + } + } + int *sub_rand_nums = (int *)malloc(sizeof(int) * bucketSize); + assert(sub_rand_nums != NULL); + MPI_Scatter(bucket, bucketSize, MPI_INT, sub_rand_nums, bucketSize, MPI_INT, 0, MPI_COMM_WORLD); + + insertionSort(sub_rand_nums,bucketSize); + + int *nums_sorted = NULL; + if (world_rank == 0) { +nums_sorted = (int *)malloc(sizeof(int) * (world_size+5) * bucketSize); +assert(nums_sorted != NULL); + } + MPI_Gather(sub_rand_nums, bucketSize, MPI_INT, nums_sorted, bucketSize, MPI_INT, 0, +MPI_COMM_WORLD); + + if (world_rank == 0) { + int i; + for(i = 0; i < bucketSize*world_size; ++i){ + if(nums_sorted[i] >= 0) printf("%d\n",nums_sorted[i]); + } + time_t finish_t = clock(); + printf("Waktu eksekusi %d data : %d process : %.5f ms\n", bucketSize, world_size, (double)(finish_t-start_t)*1000/CLOCKS_PER_SEC); + } + + if (world_rank == 0) { +free(rand_nums); +free(bucket); +free(nums_sorted); +free(indeks); + } + free(sub_rand_nums); + + MPI_Barrier(MPI_COMM_WORLD); + MPI_Finalize(); +} + diff --git a/laporan.txt b/laporan.txt new file mode 100644 index 0000000000000000000000000000000000000000..dba86e4dcc9c44dd78f31d5d06a138dec5f39239 --- /dev/null +++ b/laporan.txt @@ -0,0 +1,66 @@ +Perbandingan waktu kinerja program + +1) +N = 50.000, M = 1 +t = 2050 ms + +N = 50.000, M = 4 +t = 370 ms + +N = 50.000, M = 8 +t = 250 ms + +N = 50.000, M = 16 +t = 270 ms + +N = 50.000, M = 32 +t = 180 ms + +2) +N = 100.000, M = 1 +t = 8070 ms + +N = 100.000, M = 4 +t = 890 ms + +N = 100.000, M = 8 +t = 410 ms + +N = 100.000, M = 16 +t = 370 ms + +N = 100.000, M = 32 +t = 310 + +3) +N = 200.000, M = 1 +t = 32880 ms + +N = 200.000, M = 4 +t = 2500 ms + +N = 200.000, M = 8 +t = 1070 ms + +N = 200.000, M = 16 +t = 900 ms + +N = 200.000, M = 32 +t = 760 + +4) +N = 400.000, M = 1 +t = 128580 ms + +N = 400.000, M = 4 +t = 9230 ms + +N = 400.000, M = 8 +t = 3190 ms + +N = 400.000, M = 16 +t = 1970 ms + +N = 400.000, M = 32 +t = 1770 + diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000..92ea49e0f18d038b9ecf1f2a2b38b30f7d9313bf Binary files /dev/null and b/main differ