diff --git a/README.md b/README.md index a5b63bfc4d56cdcd62f6d00ac2f63a71868ec93b..eaedc66fe292766ba40501a3a81bc1551e62b7b6 100644 --- a/README.md +++ b/README.md @@ -13,63 +13,73 @@ Program ini dapat melakukan pengurutan elemen array dengan menggunakan algoritma ## Laporan Pengerjaan ### 1. Deskripsi Solusi Parallel +Radix sort dilakukan dengan cara mencari bilangan terbesar sesuai dengan digit - digitnya terurut dari digit terbesar hingga digit terkecil, dengan menggunakan fungsi `getMax` dengan setiap threadnya membandingkan 2 elemen array dan kemudian akan di-<i>sort</i> dengan menggunakan fungsi `countSort` pada setiap digitnya dengan memanfaatkan fungsi `storeCount`. Fungsi `countSort` pada `main` akan dilakukan secara parallel dan melakukan rangkain algoritma cuda. ### 2. Analisis Solusi +Solusi algoritma <i>Radix Sort</i> secara parallel dapat mempercepat waktu eksekusi program dan meningkatkan performanya. Proses eksekusi program dapat menjadi lebih cepat karena pada proses `countSort` dipecah - pecah sejumlah jumlah prosesor agar pecahan tersebut dapat dikerjakan secara bersamaan untuk kemudian digabung. +Program ini akan dapat lebih dipercepat jika pada fungsi `getMax` dilakukan juga secara parallel, sehingga setiap kali program mencari nilai terbesar waktunya menjadi lebih cepat. +Selain itu, program juga dapat dikembangkan dan dipercepat dengan mengubah angka yang digunakan dalam array menjadi bitwise. Jika `countSort` dilakukan secara bitwise maka perhitungan sorting perdigitnya hanya membandingkan 2 angka yaitu 0 dan 1, sehingga perhitungan juga akan menjadi lebih cepat karena kompleksitas program berkurang. ### 3. Jumlah Pemetaan Thread +jumlah thread atau block_size yang dignunakan adalah 1024 hal ini berdasarkan ujicoba yang dilakukan mulai dari 256 , 512 dan 1024 dan hasil yang paling cepat adalah 1024 sehingga kami memilih untuk menggunakan threads sebanyak 1024 ### 4. Pengukuran Kinerja #### Serial **N = 5.000** -Pengujian 1: -Pengujian 2: -Pengujian 3: +Pengujian 1: Executed in 3612.000000 ms +Pengujian 2: Executed in 2787.000000 ms +Pengujian 3: Executed in 3611.000000 ms **N = 50.000** -Pengujian 1: -Pengujian 2: -Pengujian 3: +Pengujian 1: Executed in 23920.000000 ms +Pengujian 2: Executed in 23209.000000 ms +Pengujian 3: Executed in 23968.000000 ms **N = 100.000** -Pengujian 1: -Pengujian 2: -Pengujian 3: +Pengujian 1: Executed in 44727.000000 ms +Pengujian 2: Executed in 41470.000000 ms +Pengujian 3: Executed in 41497.000000 ms **N = 200.000** -Pengujian 1: -Pengujian 2: -Pengujian 3: +Pengujian 1: Executed in 105366.000000 ms +Pengujian 2: Executed in 111099.000000 ms +Pengujian 3: Executed in 84916.000000 ms **N = 400.000** -Pengujian 1: -Pengujian 2: -Pengujian 3: +Pengujian 1: Executed in 145486.000000 ms +Pengujian 2: Executed in 238636.000000 ms +Pengujian 3: Executed in 147823.000000 ms #### Parallel **N = 5.000** -Pengujian 1: Executed in 90790.1 microseconds. -Pengujian 2: Executed in 90734.5 microseconds. -Pengujian 3: Executed in 90782.6 microseconds. +Pengujian 1: Executed in 90790.1 ms +Pengujian 2: Executed in 90734.5 ms +Pengujian 3: Executed in 90782.6 ms **N = 50.000** -Pengujian 1: Executed in 44813.2 microseconds. -Pengujian 2: Executed in 45517.9 microseconds. -Pengujian 3: Executed in 44822.7 microseconds. +Pengujian 1: Executed in 44813.2 ms +Pengujian 2: Executed in 45517.9 ms +Pengujian 3: Executed in 44822.7 ms **N = 100.000** -Pengujian 1: Executed in 96373.5 microseconds. -Pengujian 2: Executed in 84866.8 microseconds. -Pengujian 3: Executed in 84885.2 microseconds. +Pengujian 1: Executed in 96373.5 ms +Pengujian 2: Executed in 84866.8 ms +Pengujian 3: Executed in 84885.2 ms **N = 200.000** -Pengujian 1: Executed in 94081.2 microseconds. -Pengujian 2: Executed in 116638 microseconds. -Pengujian 3: Executed in 89034.4 microseconds. +Pengujian 1: Executed in 94081.2 ms +Pengujian 2: Executed in 116638 ms +Pengujian 3: Executed in 89034.4 ms **N = 400.000** -Pengujian 1: Executed in 170059 microseconds. -Pengujian 2: Executed in 171197 microseconds. -Pengujian 3: Executed in 171990 microseconds. +Pengujian 1: Executed in 170059 ms +Pengujian 2: Executed in 171197 ms +Pengujian 3: Executed in 171990 ms ###5. Analisis Perbandingan Serial dan Parallel **N = 5.000** +pada N = 5000 serial lebih cepat dari pada parallel karena array masih dianggap lebih kecil sehingga tidak efektif bagi parallel yang menggunakan banyak blok **N = 50.000** +pada N = 50000 serial lebih cepat dari pada parallel karena array masih dianggap lebih kecil sehingga tidak efektif bagi parallel yang menggunakan banyak blok namun hasil kali ini sudah mendekati hasil serial yaitu sebesar 2x waktu serial **N = 100.000** +pada N = 100000 serial lebih cepat dari pada parallel karena array masih dianggap lebih kecil sehingga tidak efektif bagi parallel yang menggunakan banyak blok namun hasil kali ini sudah mendekati hasil serial yaitu sebesar 2x waktu serial **N = 200.000** -**N = 400.000** \ No newline at end of file +pada N = 200000 waktu parallel sudah mengalahkan waktu serial , karena array yang dibangun sudah cukup besar sehingga program parallel lebih unggul karena memanfaatkan blok yang banyak dan menghasilkan waktu yang lebih cepat dari serial +**N = 400.000** +pada N = 400000 waktu parallel sudah mengalahkan waktu serial , karena array yang dibangun sudah cukup besar sehingga program parallel lebih unggul karena memanfaatkan blok yang banyak dan menghasilkan waktu yang lebih cepat dari serial \ No newline at end of file diff --git a/src/radix_sort_parallel.cu b/src/radix_sort_parallel.cu index 1935e1da24b692609886ebe8e02761c26e7ac296..fae9765ddeb4fd95ddfae8a1e23a7aa37006774f 100644 --- a/src/radix_sort_parallel.cu +++ b/src/radix_sort_parallel.cu @@ -118,7 +118,7 @@ int main(int argc, char *argv[]) output << k << ":"<<h_arr[k] << " " ; } output.close(); - cout << "Executed in " << time * 1000 << " microseconds." << endl; + cout << "Executed in " << time * 1000 << " ms" << endl; cudaFree(d_arr); curandDestroyGenerator(curand_gen); cudaEventDestroy(start);