diff --git a/bucket_sort b/bucket_sort new file mode 100755 index 0000000000000000000000000000000000000000..1e4e663358a2dfe9eb9cbb6fed961666b918dd39 Binary files /dev/null and b/bucket_sort differ diff --git a/bucket_sort.c b/bucket_sort.c new file mode 100644 index 0000000000000000000000000000000000000000..a587768952e0f0c113634b7579a8084c28a0c148 --- /dev/null +++ b/bucket_sort.c @@ -0,0 +1,120 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <mpi.h> +#include <assert.h> + +void insertion_sort(int* array, int num_elements) { + // Sorting array + int i; + int d; + int t; + for (i = 1; i < num_elements; i++) { + d = i; + + while ( d > 1 && array[i] < array[d-1] ) { + t = array[d]; + array[d] = array[d-1]; + array[d-1] = t; + + d--; + } + } +} + + +int cmpfunc (const void * a, const void * b) +{ + return ( *(int*)a - *(int*)b ); +} + +int main(int argc, char const *argv[]) { + if (argc != 2) { + fprintf(stderr, "Usage: avg num_elements_per_proc\n"); + exit(1); + } + + MPI_Init(NULL, NULL); + + int BUCKET_SIZE = atoi(argv[1]); //Each Bucket size + int MAX_VALUE = atoi(argv[1]); + int i, j, k, z, iter=0; + time_t t; + + int WORLD_RANK; + int WORLD_SIZE; //Number of process / Number of bucket + MPI_Comm_rank(MPI_COMM_WORLD, &WORLD_RANK); + MPI_Comm_size(MPI_COMM_WORLD, &WORLD_SIZE); + double begin = MPI_Wtime(); + srand((unsigned) time(&t)); + if (WORLD_RANK == 0) { //Initialize bucket + int rand_array[BUCKET_SIZE]; + + for (i = 0; i < BUCKET_SIZE; i++){ + rand_array[i] = rand() % MAX_VALUE; + // printf("%d\n", rand_array[i]); + } + int sum = 0; + int bucket[BUCKET_SIZE]; + int low, high; + for (i = 1; i < WORLD_SIZE; i++){ + for (j = 0; j < BUCKET_SIZE; j++){ + bucket[j] = -1; + } + // printf("%d\n", i); + + for (j = 0; j < BUCKET_SIZE; j++){ + low = (i - 1) * (MAX_VALUE/WORLD_SIZE+1); + high = i * (MAX_VALUE/WORLD_SIZE+1); + //printf("%d %d %d %d %d\n", MAX_VALUE, WORLD_SIZE, low, high, rand_array[j]); + if ((rand_array[j] < high) && (rand_array[j] >= low)){ + bucket[iter] = rand_array[j]; + sum++; + //printf("%d\n", bucket[iter]); + iter++; + } else { +// printf("%d\n", rand_array[j]); + } + } + //printf("AAA %d AAA\n", sum); + + MPI_Send(bucket, BUCKET_SIZE, MPI_INT, i, 0, MPI_COMM_WORLD); + iter = 0; + } + } else { + int bucket_n[BUCKET_SIZE]; + MPI_Recv(bucket_n, BUCKET_SIZE, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + qsort(bucket_n, BUCKET_SIZE, sizeof(int), cmpfunc); + int lol = 0; + + MPI_Send(bucket_n, BUCKET_SIZE, MPI_INT, 0, 0, MPI_COMM_WORLD); + } + + if (WORLD_RANK == 0){ + int bucket[BUCKET_SIZE]; + int delim = 0; + for (i = 1; i<WORLD_SIZE; i++){ + int bucket_n[BUCKET_SIZE]; + //printf("%d\n", i); + MPI_Recv(bucket_n, BUCKET_SIZE, MPI_INT, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + //printf("Tulis dari proses %d\n", i); + for (z = 0; z < BUCKET_SIZE; z++){ + // printf("%d ", bucket_n[z]); + if (bucket_n[z] != -1){ + bucket[delim] = bucket_n[z]; + delim++; + } + } + //printf("\n"); + } + //assert(delim == BUCKET_SIZE); + for (i = 0; i < BUCKET_SIZE; i++){ + printf("%d\n", bucket[i]); + } + + double end = MPI_Wtime(); + printf("Time elapsed: %f seconds\n", end - begin); + } + MPI_Finalize(); + return 0; +} diff --git a/mpi_hostfile b/mpi_hostfile new file mode 100644 index 0000000000000000000000000000000000000000..bffbf8847866f00c5ba8aefc9d5856feb4a31cb3 --- /dev/null +++ b/mpi_hostfile @@ -0,0 +1,11 @@ +#daftar host +localhost +167.205.35.26 +167.205.35.28 +167.205.35.29 +167.205.35.30 +167.205.35.31 +#167.205.35.32 +#167.205.35.33 +#167.205.35.34 +