Skip to content
Snippets Groups Projects
Commit 7c547c03 authored by Nicholas R.P.'s avatar Nicholas R.P.
Browse files

Add README.md

parent e79f852c
No related merge requests found
Pipeline #12517 failed with stages
README.md 0 → 100644
<img src="logo.png">
Parallel Radix Sort - CUDA
&middot;
[![GitLab license](https://img.shields.io/github/license/Day8/re-frame.svg)](LICENSE)
=====
> A non-comparative integer sorting algorithm that sorts data with integer keys by grouping keys by the individual digits which share the same significant position and value.
## Table Of Contents
- [Introduction](#introduction)
- [Requirements](#requirements)
- [Run Radix Sort](#run-radix-sort)
- [Details of Radix Sort (Indonesian)](#details-of-radix-sort-(indonesian))
- [Author](#author)
- [Words From Author](#words-from-author)
## Introduction
This is the implementation of parallel radix sort algorithm using OpenMPI.
## Requirements
* GCC Compiler
## Run Radix Sort
Follow these steps to run Parallel Radix Sort on your local:
1. Compile Radix Sort Program with `make`.
2. Run `./serial_radix_sort <array_length>` for serial radix sort.
3. Run `mpirun -np <processors> --hostfile mpi_hostfile parallel_radix_sort <array_length>` for parallel radix sort.
4. You will see the performance for each radix sort.
## Details of Radix Sort (Indonesian)
- [**Deskripsi Solusi Parallel**](#deskripsi-solusi-parallel)
- [**Analisis Solusi Parallel**](#analisis-solusi-parallel)
- [**Pengukuran Kinerja Solusi Parallel**](#pengukuran-kinerja-solusi-parallel)
- [**Analisis Kinerja Solusi Parallel**](#analisis-kinerja-solusi-parallel)
### Deskripsi Solusi Parallel
Radix sort adalah algoritma sorting yang termasuk dalam kelas non-comparison karena pada dasarnya radix sort hanya melakukan counting sort terhadap tiap digit pada masing-masing elemen input. Disanalah letak tantangan untuk mengembangkan solusi parallel untuk radix sort karena counting sort tidak dapat dikonversi menjadi paralel dengan mudah. Hal ini dikarenakan saat melakukan counting sort, perhitungan setiap iterasinya dependen terhadap perhitungan pada iterasi sebelumnya.
Berangkat dari permasalahan tersebut, kami menggunakan bantuan OpenMPI untuk melakukan parallel radix sort, dimana kami menggunakan scatter & reduce untuk proses subroutine counting sort yang dilakukan. Proses count yang kami terapkan menyimpan jumlah kemunculan untuk tiap digit dalam array statik yang berisi 10 elemen. Kami membagi (dengan scatter) proses perhitungan ini pada setiap process dan menjumlahkan hasilnya menggunakan reduce. Setelah itu kami melakukan prefix sum untuk array ini yang dilakukan secara serial. Walaupun serial, namun seharusnya tidak terlalu berdampak pada performa karena jumlah elemen array hanya 10.
Sebelum itu, diperlukan juga untuk tahu nilai terbesar dalam array guna menentukan jumlah digit maksimum. Kami juga memparalelkan fungsi get_max ini dengan menggunakan scatter & reduce.
### Analisis Solusi Parallel
Kompleksitas dari solusi Parallel kami adalah O((n/c) + n + 10), sedangkan kompleksitas solusi Serial adalah O (2n + 10). C disini adalah jumlah proses yang dilakukan. Dapat dilihat bahwa semakin banyak process yang tersedia dalam solusi parallel yang kami buat, performanya semakin mendekati 2x lebih cepat dari performa solusi serial. Hal ini dikarenakan kami hanya memparallelkan fungsi counting sort dan get_max saja, sehingga dalam Big O solusi Parallel kami terdapat tambahan sejumlah n, yang merupakan waktu pemindahan elemen dari indeks lama ke indeks yang sudah sorted dimana proses ini masih berjalan secara serial. Sehingga batas peningkatan performa solusi parallel kami adalah 2x.
Jumlah process (C) yang digunakan pada solusi paralel kami adalah sebanyak-banyaknya asalkan jumlah elemen dalam array (n) dapat dibagi dengan C. Hal ini dikarenakan semakin banyak jumlah process yang digunakan (C mendekati tak hingga), performa solusi parallel semakin mendekati 2x performa solusi serial.
### Pengukuran Kinerja Solusi Parallel
Kami menggunakan metode perbandingan waktu performa untuk mengukur kinerja solusi parallel yang telah kami buat. Kami membandingkan waktu yang dibutuhkan oleh solusi radix sort parallel kami dengan waktu yang dibutuhkan oleh radix sort serial pada array yang isi dan jumlahnya sama persis. Berikut adalah snippet code yang kami pakai untuk mengukur performa solusi kami:
```c
start = clock();
radix_sort(arr, n, num_process, rank);
end = clock();
cpu_time_used = ((double) (end - start)) * 1000000 / CLOCKS_PER_SEC;
```
Berikut ini adalah hasil pengukuran kinerja solusi kami pada server `10.5.32.21`:
**n = 5000**
```
Serial:
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 5000
Sorting in serial...
Serial radix sort finished, time taken: 4961.000000 μs
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 5000
Sorting in serial...
Serial radix sort finished, time taken: 4964.000000 μs
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 5000
Sorting in serial...
Serial radix sort finished, time taken: 4966.000000 μs
===============================================================================
Parallel:
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 5000
Sorting in parallel...
Parallel radix sort finished, time taken: 2930.000000 μs
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 5000
Sorting in parallel...
Parallel radix sort finished, time taken: 2412.000000 μs
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 5000
Sorting in parallel...
Parallel radix sort finished, time taken: 2744.000000 μs
```
**n = 50000**
```
Serial:
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 50000
Sorting in serial...
Serial radix sort finished, time taken: 32317.000000 μs
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 50000
Sorting in serial...
Serial radix sort finished, time taken: 31646.000000 μs
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 50000
Sorting in serial...
Serial radix sort finished, time taken: 32932.000000 μs
===============================================================================
Parallel:
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 50000
Sorting in parallel...
Parallel radix sort finished, time taken: 25641.000000 μs
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 50000
Sorting in parallel...
Parallel radix sort finished, time taken: 25331.000000 μs
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 50000
Sorting in parallel...
Parallel radix sort finished, time taken: 24416.000000 μs
```
**n = 100000**
```
Serial:
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 100000
Sorting in serial...
Serial radix sort finished, time taken: 59351.000000 μs
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 100000
Sorting in serial...
Serial radix sort finished, time taken: 58114.000000 μs
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 100000
Sorting in serial...
Serial radix sort finished, time taken: 58298.000000 μs
===============================================================================
Parallel:
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 100000
Sorting in parallel...
Parallel radix sort finished, time taken: 47523.000000 μs
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 100000
Sorting in parallel...
Parallel radix sort finished, time taken: 46905.000000 μs
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 100000
Sorting in parallel...
Parallel radix sort finished, time taken: 47002.000000 μs
```
**n = 200000**
```
Serial:
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 200000
Sorting in serial...
Serial radix sort finished, time taken: 113978.000000 μs
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 200000
Sorting in serial...
Serial radix sort finished, time taken: 112564.000000 μs
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 200000
Sorting in serial...
Serial radix sort finished, time taken: 112868.000000 μs
===============================================================================
Parallel:
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 200000
Sorting in parallel...
Parallel radix sort finished, time taken: 90890.000000 μs
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 200000
Sorting in parallel...
Parallel radix sort finished, time taken: 90992.000000 μs
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 200000
Sorting in parallel...
Parallel radix sort finished, time taken: 90841.000000 μs
```
**n = 400000**
```
Serial:
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 400000
Sorting in serial...
Serial radix sort finished, time taken: 223209.000000 μs
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 400000
Sorting in serial...
Serial radix sort finished, time taken: 224231.000000 μs
if3230-13516020@hpc21:~/openmpi$ ./serial_radix_sort 400000
Sorting in serial...
Serial radix sort finished, time taken: 224140.000000 μs
===============================================================================
Parallel:
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 400000
Sorting in parallel...
Parallel radix sort finished, time taken: 180520.000000 μs
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 400000
Sorting in parallel...
Parallel radix sort finished, time taken: 180863.000000 μs
if3230-13516020@hpc21:~/openmpi$ mpirun -np 2 --hostfile mpi_hostfile parallel_radix_sort 400000
Sorting in parallel...
Parallel radix sort finished, time taken: 180987.000000 μs
```
### Analisis Kinerja Solusi Parallel
Kinerja solusi Parallel kami berjalan lebih cepat dari Serial untuk seluruh n yang diujikan, yaitu 5000, 50000, 100000, 200000, dan 400000. Kompleksitas dari solusi Parallel kami adalah O((n/c) + n + 10), sedangkan kompleksitas solusi Serial adalah O (2n + 10). C disini adalah jumlah proses yang dilakukan. Dari kompleksitas parallel kami, dapat disimpulkan bahwa solusi Parallel yang kami buat maksimal lebih cepat 2x dari kecepatan solusi Serial. Perlu diingat bahwa kami hanya memparallelkan fungsi counting sort dan get_max saja, sehingga dalam Big O solusi Parallel kami terdapat tambahan sejumlah n, yang merupakan waktu pemindahan elemen dari indeks lama ke indeks yang sudah sorted dimana proses ini masih berjalan secara serial.
## Author
### Faza Fahleraz
```
Email: 13516095@std.stei.itb.ac.id
Github: https://github.com/ffahleraz
Task:
* Membuat counting sort parallel
* Membuat parallel radix sort
* Membuat serial radix sort
* Membuat Dokumentasi
```
### Nicholas Rianto Putra
```
Email: 13516020@std.stei.itb.ac.id
Github: https://github.com/nicholaz99
Task:
* Membuat Main Program
* Membuat Program mengoutputkan hasil ke dalam file .txt pada folder output
* Memparallelkan fungsi get_max dengan scatter dan reduce
* Membuat Dokumentasi
```
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