Skip to content
Snippets Groups Projects
Commit d42216e7 authored by 13513022's avatar 13513022
Browse files

Implement bucket sort

parent 370399cd
No related merge requests found
// Copyright 2012 www.mpitutorial.com // Copyright www.computing.llnl.gov
// Program yang menghitung rata rata dari array secara paralel menggunakan scatter dan gather
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include <mpi.h> #include <mpi.h>
#include <assert.h> #include <assert.h>
float *create_rand_nums(int num_elements) { float *create_rand_nums(int num_elements) {
float *rand_nums = (float *)malloc(sizeof(float) * num_elements); float *rand_nums = (float *)malloc(sizeof(float) * num_elements);
assert(rand_nums != NULL); assert(rand_nums != NULL);
int i; int i;
for (i = 0; i < num_elements; i++) { for (i = 0; i < num_elements; i++) {
rand_nums[i] = (rand() / (float)RAND_MAX); rand_nums[i] = rand() % num_elements;
} }
return rand_nums; return rand_nums;
} }
float compute_avg(float *array, int num_elements) { void insertion_sort(float *array, int num_elements) {
float sum = 0.f; int d, c, temp;
int i; for (c = 1; c < num_elements; c++) {
for (i = 0; i < num_elements; i++) { d = c;
sum += array[i]; while (d > 0 && array[d] < array[d-1]) {
} temp = array[d];
return sum / num_elements; array[d] = array[d-1];
} array[d-1] = temp;
d--;
}
}
}
int main(int argc, char** argv) { int main(int argc, char *argv[]) {
if (argc != 2) { const int BUCKET_HEADER = 1;
fprintf(stderr, "Usage: avg num_elements_per_proc\n"); const int BUCKET_BODY = 2;
exit(1);
} int i,j;
int num_elements = atoi(argv[1]);
int num_elements_per_proc = atoi(argv[1]);
srand(time(NULL)); MPI_Status Stat;
MPI_Init(NULL, NULL);
MPI_Init(NULL, NULL);
int world_size;
int world_rank; MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size; int world_rank;
MPI_Comm_size(MPI_COMM_WORLD, &world_size); MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
float *rand_nums = NULL; int bucket_range = num_elements / world_size;
if (world_rank == 0) { float bucket[world_size][num_elements];
rand_nums = create_rand_nums(num_elements_per_proc * world_size); int count[world_size];
}
// Buat elemen randomm
float *sub_rand_nums = (float *)malloc(sizeof(float) * if (world_rank == 0) {
num_elements_per_proc); float *rand_nums = NULL;
assert(sub_rand_nums != NULL); rand_nums = create_rand_nums(num_elements);
MPI_Scatter(rand_nums, num_elements_per_proc, MPI_FLOAT, sub_rand_nums, // Bagi elemen tersebut ke dalam bucket
num_elements_per_proc, MPI_FLOAT, 0, MPI_COMM_WORLD); for (i = 0; i < world_size; ++i) {
for (j = 0; j < num_elements; ++j) {
float sub_avg = compute_avg(sub_rand_nums, num_elements_per_proc); bucket[i][j] = -1;
}
float *sub_avgs = NULL; }
if (world_rank == 0) {
sub_avgs = (float *)malloc(sizeof(float) * world_size); for (i = 0; i < world_size; ++i) {
assert(sub_avgs != NULL); count[i] = 0;
} }
MPI_Gather(&sub_avg, 1, MPI_FLOAT, sub_avgs, 1, MPI_FLOAT, 0,
MPI_COMM_WORLD); for (i = 0; i < num_elements; ++i) {
int idx = (int) rand_nums[i]/bucket_range;
if (world_rank == 0) { bucket[idx][count[idx]] = rand_nums[i];
float avg = compute_avg(sub_avgs, world_size); count[idx]++;
printf("Avg of all elements is %f\n", avg); }
}
// Kirim bucket ke proses yang sesuai
if (world_rank == 0) { for (i = 0; i < world_size; ++i) {
free(rand_nums); // Kirim ukuran bucket
free(sub_avgs); int size = count[i];
} MPI_Send(&size, 1, MPI_INT, i, BUCKET_HEADER, MPI_COMM_WORLD);
free(sub_rand_nums);
// Kirim isi bucket
MPI_Barrier(MPI_COMM_WORLD); MPI_Send(bucket[i], count[i], MPI_FLOAT, i, BUCKET_BODY, MPI_COMM_WORLD);
MPI_Finalize(); }
}
}
// Ambil bucket yang dikirim oleh proses utama
int bucket_size;
MPI_Recv(&bucket_size, 1, MPI_INT, 0, BUCKET_HEADER, MPI_COMM_WORLD, &Stat);
float *my_bucket = (float *)malloc(sizeof(float) * bucket_size);
MPI_Recv(my_bucket, bucket_size, MPI_FLOAT, 0, BUCKET_BODY, MPI_COMM_WORLD, &Stat);
// Urutkan my_bucket yang ada di tiap proses
insertion_sort(my_bucket, bucket_size);
// printf("From procces %d\n", world_rank);
// for (i = 0; i < bucket_size; i++) {
// printf("elemen ke-%d: %f\n", i, my_bucket[i]);
// }
// Kirim kembali my_bucket yang terurut ke proses 0
MPI_Send(&bucket_size, 1, MPI_INT, 0, BUCKET_HEADER, MPI_COMM_WORLD);
MPI_Send(my_bucket, bucket_size, MPI_FLOAT, 0, BUCKET_BODY, MPI_COMM_WORLD);
// Gabungkan my_bucket menjadi satu array
if (world_rank == 0) {
float *sorted_array = (float *)malloc(sizeof(float) * num_elements);
int counter = 0;
for (i = 0; i < world_size; ++i) {
int recv_bucket_size;
MPI_Recv(&recv_bucket_size, 1, MPI_INT, i, BUCKET_HEADER, MPI_COMM_WORLD, &Stat);
float* recv_bucket = (float *)malloc(sizeof(float) * bucket_size);
MPI_Recv(recv_bucket, bucket_size, MPI_FLOAT, i, BUCKET_BODY, MPI_COMM_WORLD, &Stat);
for (j = 0; j < recv_bucket_size; ++j) {
sorted_array[counter] = recv_bucket[j];
counter++;
}
}
// Print array yang sudah terurut;
printf("Element yang sudah terurut:\n");
for (j = 0; j < num_elements; ++j) {
printf("%f\n", sorted_array[j]);
}
}
MPI_Finalize();
}
\ No newline at end of file
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