diff --git a/README.md b/README.md index 62bde7464a2d117abd0ee5f5e1b07106352dc002..6eee3559d6999615ad29498f272f9d75108885be 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ This is a simple implementation of parallel radix sort algorithm using CUDA. ## Run Radix Sort 1. Compile Radix Sort Program with `make`. 2. Run `./serial_radix_sort <array_length>` for serial radix sort. -3. Run `./parallel_radix_sort <array_length>` for parallel radix sort. +3. Run `./radix_sort <array_length>` for parallel radix sort. 4. You will see the performance for each radix sort implementations. ## Details of Radix Sort (Indonesian) @@ -37,14 +37,14 @@ Radix sort adalah algoritma sorting yang termasuk dalam kelas non-comparison kar Berangkat dari permasalahan tersebut, kami menggunakan bantuan CUDA untuk melakukan parallel radix sort, dimana kami mencoba untuk memparalelkan beberapa aspek dari subroutine counting sort yang dilakukan dalam radix sort. Bagian yang kami paralelkan adalah pembuatan flag (0 atau 1) untuk tiap elemen array dan proses scatter untuk menyusun ulang posisi elemen-elemen dalam array. Namun, pada solusi kami, masih ada beberapa bagian yang dilakukan oleh host secara serial yaitu proses prefix sum. -Jumlah thread per block yang kami pakai adalah 64 karena +Jumlah thread per block yang kami pakai adalah 128 karena kami mencoba pada server ITB dan hasil parallel radix sortnya lebih cepat. Untuk pemetaan thrad sendiri, program kami akan dibagi menjadi beberapa thread, dimana seperti yang kita tahu bahwa block terdiri dari thread, dan block yang kami pakai sebanyak 128. ### Analisis Solusi Parallel Kompleksitas dari solusi Parallel kami adalah O(n + 2n/c), 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 pembuatan flags dan scatter saja, sehingga dalam Big O solusi Parallel kami terdapat tambahan sejumlah n, yang merupakan waktu perhitungan prefix sum dimana proses ini masih berjalan secara serial. Sehingga batas peningkatan performa solusi parallel kami adalah 2x. Solusi ini sebenarnya bisa dibuat lebih efisien apabila proses prefix scan dilakukan secara paralel sepenuhnya misalkan dengan Blelloch Scan. -Pada bagian paralel dari solusi ini, setiap thread melakukan komputasi untuk n/c elemen, misalnya menentukan flag. +Pada bagian paralel dari solusi ini, setiap thread melakukan komputasi untuk n/c elemen, misalnya menentukan flag. ### 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: @@ -69,50 +69,152 @@ Berikut ini adalah hasil pengukuran kinerja solusi kami pada server ITB: **n = 5000** ``` Serial: +13516020@housting:~/cuda$ ./serial_radix_sort 5000 +Sorting in serial... +Serial radix sort finished, time taken: 3476.000000 μs + +13516020@housting:~/cuda$ ./serial_radix_sort 5000 +Sorting in serial... +Serial radix sort finished, time taken: 3587.000000 μs + +13516020@housting:~/cuda$ ./serial_radix_sort 5000 +Sorting in serial... +Serial radix sort finished, time taken: 3482.000000 μs =============================================================================== Parallel: +13516020@housting:~/cuda$ ./radix_sort 5000 +Sorting in parallel... +Parallel radix sort finished, time taken: 755029.000000 μs + +13516020@housting:~/cuda$ ./radix_sort 5000 +Sorting in parallel... +Parallel radix sort finished, time taken: 813429.000000 μs + +13516020@housting:~/cuda$ ./radix_sort 5000 +Sorting in parallel... +Parallel radix sort finished, time taken: 762473.000000 μs ``` **n = 50000** ``` Serial: +13516020@housting:~/cuda$ ./serial_radix_sort 50000 +Sorting in serial... +Serial radix sort finished, time taken: 24206.000000 μs + +13516020@housting:~/cuda$ ./serial_radix_sort 50000 +Sorting in serial... +Serial radix sort finished, time taken: 30431.000000 μs +13516020@housting:~/cuda$ ./serial_radix_sort 50000 +Sorting in serial... +Serial radix sort finished, time taken: 24103.000000 μs =============================================================================== Parallel: +13516020@housting:~/cuda$ ./radix_sort 50000 +Sorting in parallel... +Parallel radix sort finished, time taken: 635070.000000 μs + +13516020@housting:~/cuda$ ./radix_sort 50000 +Sorting in parallel... +Parallel radix sort finished, time taken: 620376.000000 μs +13516020@housting:~/cuda$ ./radix_sort 50000 +Sorting in parallel... +Parallel radix sort finished, time taken: 629186.000000 μs ``` **n = 100000** ``` Serial: +13516020@housting:~/cuda$ ./serial_radix_sort 100000 +Sorting in serial... +Serial radix sort finished, time taken: 40066.000000 μs +13516020@housting:~/cuda$ ./serial_radix_sort 100000 +Sorting in serial... +Serial radix sort finished, time taken: 39948.000000 μs + +13516020@housting:~/cuda$ ./serial_radix_sort 100000 +Sorting in serial... +Serial radix sort finished, time taken: 39953.000000 μs =============================================================================== Parallel: +13516020@housting:~/cuda$ ./radix_sort 100000 +Sorting in parallel... +Parallel radix sort finished, time taken: 659299.000000 μs + +13516020@housting:~/cuda$ ./radix_sort 100000 +Sorting in parallel... +Parallel radix sort finished, time taken: 685127.000000 μs +13516020@housting:~/cuda$ ./radix_sort 100000 +Sorting in parallel... +Parallel radix sort finished, time taken: 622940.000000 μs ``` **n = 200000** ``` Serial: +13516020@housting:~/cuda$ ./serial_radix_sort 200000 +Sorting in serial... +Serial radix sort finished, time taken: 83413.000000 μs + +13516020@housting:~/cuda$ ./serial_radix_sort 200000 +Sorting in serial... +Serial radix sort finished, time taken: 73147.000000 μs +13516020@housting:~/cuda$ ./serial_radix_sort 200000 +Sorting in serial... +Serial radix sort finished, time taken: 82367.000000 μs =============================================================================== Parallel: +13516020@housting:~/cuda$ ./radix_sort 200000 +Sorting in parallel... +Parallel radix sort finished, time taken: 760482.000000 μs +13516020@housting:~/cuda$ ./radix_sort 200000 +Sorting in parallel... +Parallel radix sort finished, time taken: 760531.000000 μs + +13516020@housting:~/cuda$ ./radix_sort 200000 +Sorting in parallel... +Parallel radix sort finished, time taken: 761216.000000 μs ``` **n = 400000** ``` Serial: +13516020@housting:~/cuda$ ./serial_radix_sort 400000 +Sorting in serial... +Serial radix sort finished, time taken: 142686.000000 μs + +13516020@housting:~/cuda$ ./serial_radix_sort 400000 +Sorting in serial... +Serial radix sort finished, time taken: 143178.000000 μs +13516020@housting:~/cuda$ ./serial_radix_sort 400000 +Sorting in serial... +Serial radix sort finished, time taken: 141915.000000 μs =============================================================================== Parallel: +13516020@housting:~/cuda$ ./radix_sort 400000 +Sorting in parallel... +Parallel radix sort finished, time taken: 785813.000000 μs + +13516020@housting:~/cuda$ ./radix_sort 400000 +Sorting in parallel... +Parallel radix sort finished, time taken: 786641.000000 μs +13516020@housting:~/cuda$ ./radix_sort 400000 +Sorting in parallel... +Parallel radix sort finished, time taken: 811905.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 + 2n/c),, 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. +Memang pada pengujian pada jumlah N yang diberikan, solusi parallel kami tidak ada yang lebih cepat dari serial. Hanya saja, jika kita lihat trend dari waktu pengujian, waktu yang dibutuhkan parallel radix sort selalu sama, berkisar pada angka 600000 - 700000 μs, sedangkan waktu yang dibutuhkan serial radix sort linear, naik seiring dengan jumlah N. Dapat disimpulkan bahwa untuk nilai N yang besar, maka solusi parallel akan jauh lebih cepat dari solusi serial radix sort. ## Author ### Faza Fahleraz