Praktikum 2 - Open MPI Radix Sort
Daftar Isi
- Praktikum 2 - Open MPI Radix Sort
Overview
Implementasi Radix Sort secara paralel pada OpenMPI. Radix Sort adalah algoritma sorting yang mengurutkan data menggunakan kunci bilangan (integer) dengan melakukan pengelompokan kunci berdasarkan angka yang memiliki kesamaan posisi dan nilai (ratusan dengan ratusan, puluhan dengan puluhan). Ide utama dari algoritma ini adalah melakukan pengurutan untuk setiap angka (digit) dari least significant digit sampai dengan most significant digit.
Petunjuk Penggunaan
Prerequisites
Berikut adalah library yang harus sudah di-install pada komputer anda.
- GCC version 7+
- CUDA Toolkit
Installing
- Panggil command
make
pada root directory repository ini.
Setelah melakukan pemanggilan commandmake
, diharapkan akan ada output sebagai berikut:make clean make[1]: Entering directory '/data' make[1]: Leaving directory '/data' make build make[1]: Entering directory '/data' nvcc src/radixsort_paralel.cu src/cudaUtil/cudaUtil.cu src/radixSort/radixSort.cu src/util/util.cpp --device-c nvcc radixsort_paralel.o util.o cudaUtil.o radixSort.o -o bin/radixsort_paralel.out gcc src/util/util.cpp src/radixsort_serial.c -o radixsort_serial.o make[1]: Leaving directory '/data'
Running The Program
-
Ketikkan
bash run_cuda.sh <N>
untuk menjalankan program Radix Sort dengan adalah jumlah elemen pada array yang ingin diurutkan. -
Apabila program berhasil dijalankan, akan keluar output yang menandakan waktu yang dibutuhkan untuk melakukan algoritma Radix Sort.
Contoh:$ bash run_cuda.sh 500000 Sorted! Parallel execution time = 258747. Serial execution time = 751007.
Pembagian Tugas
1. Tugas - Adylan Roaffa Ilmy
No | Tugas |
---|---|
1 | Optimasi CUDA + analisis |
2 | Output writer |
3 | Membuat README.md |
2. Tugas - Ayrton Cyril
No | Tugas |
---|---|
1 | Membuat paralel create bucket |
2 | Membuat copy output |
3 | Membuat penghitung waktu |
Laporan Pengerjaan
Deskripsi Solusi
- Melakukan sorting radix sort dengan Most Significant Bit
- Membagi element array yang sudah di sort ke setiap proses. Setiap thread dibagi serata mungkin dengan aturan tidak boleh ada kumpulan Most Significant Bit yang sama yang terpisah di 2 proses yang berbeda
- Lakukan radix sort pada setiap masing-masing proses
- Gabungkan kembali hasil sorting ke array pada root
Analisis Solusi
Dari hasil analisis yang paling berpengaruh dalam performa Radix Sort CUDA adalah dengan menggunakan GPU dalam melaksanakan pengurutan array. Overhead yang diakibatkan oleh fungsi cudaMalloc dan cudaMemcpy adalah hal yang menyebabkan algoritma Radix Sort terasa lambat apabila dijalankan secara parallel.
Pemetaan Thread & Jumlah Thread
Jumlah thread yang digunakan pada kasus ini adalah 256 thread. Hal ini dikarenakan pada CUDA GPU, thread harus dalam kelipatan 32. Dan berdasarkan percobaan yang telah kami lakukan, jumlah thread yang paling optimal dalam penyelesaian kasus Radix Sort adalah sejumlah 256 thread.
Spesifikasi Hardware
Percobaan digunakan dengan menggunakan Asus ROG GL552-VW dengan spesifikasi sebagai berikut
No | Nama | Keterangan |
---|---|---|
1 | Processor | Intel Skylake Core i7-6700HQ CPU, quad-core 2.6 GHz (3.5 GHz TBoost) |
2 | Video | Integrated Intel HD 530 + Nvidia GTX 960M 4GB |
3 | Memory | 16 GB DDR4 2133Mhz (2xDIMMs) |
4 | Storage | 1 TB 2.5″ HDD (Hitachi HTS5410) |
Pengukuran Kinerja
Satuan kinerja yang digunakan adalah ukuran waktu dengan satuan microseconds (μs). Berikut adalah hasil pengukuran kinerja algoritma Radix Sort yang dijalankan secara parallel dibandingkan dengan Radix Sort yang dijalankan secara serial. Hasil dicatat dilakukan dengan laptop.
- Pengetesan pada local
No | N | Waktu Eksekusi Serial (μs) | Waktu Eksekusi Parallel (μs) |
---|---|---|---|
1 | 5.000 | 1241505 1229600 780531 |
1190322 1180110 732153 |
2 | 50.000 | 991688 1012789 735255 |
894433 874755 613396 |
3 | 100000 | 1733229 578202 1188002 |
1522080 390158 997728 |
4 | 200000 | 1316615 526201 1248599 |
978895 190177 167008 |
5 | 400000 | 2167407 1481110 2252768 |
1541969 836728 1615249 |
Analisis Kinerja
Seperti yang dapat dilihat pada bagian pengukuran kinerja di atas, dapat dilihat bahwa pengerjaan secara parallel hampir selalu dapat melampaui waktu pengerjaan Radix Sort dibandingkan dengan pengerjaan secara serial. Ini berarti algoritma parallel yang kami buat telah dapat melampaui baseline yang telah ditetapkan oleh pengerjaan secara serial.
Namun, dikarenakan dengan overhead fungsi cudaMalloc dan cudaMemcpy yang masing-masing berfungsi untuk melakukan alokasi dan melakukan copy pada GPU device, terkadang waktu eksekusi Radix Sort secara paralel dapat lebih lambat dibandingkan pengerjaan secara serial. Oleh karena itu, cudaMalloc dan cudaMemcpy merupakan sebab lambannya pengerjaan secara parallel menggunakan CUDA.
Authors
- Adylan Roaffa Ilmy - 13516016
- Ayrton Cyril Niwarlangga - 13516019