diff --git a/bs b/bs index b140c5cf6a0816b2b05212cc0ada63b123451275..602ca28e3fe19d5c06fe7992e2a8262542410f52 100755 Binary files a/bs and b/bs differ diff --git a/bucket_sort.c b/bucket_sort.c index 40fb0c7b97f4d3c97c0c9c5972898bbf6c08af2c..967dfc2280ed20a0164d3e6484b3728906df29c9 100644 --- a/bucket_sort.c +++ b/bucket_sort.c @@ -1,4 +1,4 @@ -/* Tifani Warnita (13513055) */ +/* Tifani Warnita (13513055) Vanya Deasy Safrina (13513035) */ /* Nama File: bucket_sort.c */ #include "mpi.h" @@ -47,52 +47,89 @@ int *createRandomArray(int n) { int main(int argc, char *argv[]) { int n = atoi(argv[1]); //num array + MPI_Init(NULL, NULL); + // MPI things int world_rank; //process id MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); int world_size; //total process - MPI_Comm_rank(MPI_COMM_WORLD, &world_size); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); MPI_Status stat; - - MPI_Init(NULL, NULL); // Parent process if (world_rank == 0) { // Create the random array int *array = NULL; array = createRandomArray(n); - - int num_bucket = n - 1; - int num_element_in_bucket[n]; + + // COBA DULU YA + int num_bucket = world_size -1; + int num_element_in_bucket[num_bucket]; int i; - for (i=0; i<n; i++) { // Initialize with 0 + for (i=0; i<num_bucket; i++) { // Initialize with 0 num_element_in_bucket[i] = 0; } + // Print element + /* printf("Array Awal : ["); + for (i=0; i<n-1; i++) { + printf("%d, ", array[i]); + } + printf("%d]\n", array[i]); */ + + // Timer (start) + double starttime = MPI_Wtime(); + + if (world_size == 1) { + insertionSort(array, n); + double endtime = MPI_Wtime(); + printf("Waktu : %lf sekon\n", endtime-starttime); + return 0; + } + // Calculate max number in each bucket for(i=0; i<n; i++) { - int position = array[i]/num_bucket; + int position = array[i] / (n/num_bucket); + if (position==num_bucket) + position = num_bucket - 1; + // printf("element: %d | n/num_bucket :%d/%d | position: %d\n", array[i], n, num_bucket, position + 1); // Send element MPI_Send(&array[i], 1, MPI_INT, position+1, - ARRAY_ELEMENT, MPI_COMM_WORLD); + ARRAY_ELEMENT, MPI_COMM_WORLD); + num_element_in_bucket[position]++; } - + + // printf("KESINI GA YA\n"); // Send max element in each bucket for(i=1; i<=num_bucket; i++) { - MPI_Send(&num_element_in_bucket[n], 1, MPI_INT, + // printf("kemana: %d; isinya:%d\n", i, num_element_in_bucket[i-1]); + MPI_Send(&num_element_in_bucket[i-1], 1, MPI_INT, i, BUCKET_SIZE, MPI_COMM_WORLD); } // Get the result from all slaves int a = 0; // Iterator for array element - for(i=1; i<=num_bucket; i++) { + for(i=0; i<num_bucket; i++) { + // printf("proses 0 menunggu kiriman proses: %d sebanyak %d element\n",i,num_element_in_bucket[i]); int j; for (j=0; j<num_element_in_bucket[i]; j++) { - MPI_Recv(&array[a], 1, MPI_INT, num_bucket, + MPI_Recv(&array[a], 1, MPI_INT, i+1, RESULT, MPI_COMM_WORLD, &stat); + // printf("proses 0 menerima array: %d index: %d\n",array[a],a); a++; } - } + // printf("proses 0 telah menerima kirim proses: %d\n",i); + } + + // Timer (end) + double endtime = MPI_Wtime(); + /* printf("Array Akhir: ["); + for(i=0; i<n-1; i++) { + printf("%d, ", array[i]); + } */ + printf("%d]\n", array[i]); + + printf("Waktu : %lf sekon\n", endtime-starttime); } else { // Slave process int local_size; MPI_Recv(&local_size, 1, MPI_INT, 0, BUCKET_SIZE, @@ -103,16 +140,19 @@ int main(int argc, char *argv[]) { for (i=0; i<local_size; i++) { MPI_Recv(&local_array[i], 1, MPI_INT, 0, ARRAY_ELEMENT, MPI_COMM_WORLD, &stat); + // printf("proses %d menerima elemen array %d\n",world_rank,local_array[i]); } - + // printf("proses %d akan memasuki sort\n",world_rank); insertionSort(local_array, local_size); + // printf("proses %d selesai sort\n",world_rank); for (i=0; i<local_size; i++) { + // printf("proses %d mengirim array %d\n",world_rank,local_array[i]); MPI_Send(&local_array[i], 1, MPI_INT, 0, RESULT, MPI_COMM_WORLD); } } - + MPI_Finalize(); return 0; }