Skip to content
Snippets Groups Projects
Commit 06b765bc authored by Andreas Halim's avatar Andreas Halim
Browse files

Add readme

parent a86ed9d8
No related merge requests found
### PARALLEL RADIX SORT
## Petunjuk penggunaan program:
1. Buka terminal
2. Pada terminal, ketik
<pre><code>make</code></pre>
untuk melakukan _build_.
3. Pada terminal, ketik
<pre><code>./radix</code></pre>
untuk melakukan _run_.
Karena compiler program (<i>nvcc</i>) tidak mengijinkan alokasi dinamik menggunakan variabel maka argumen program tidak dapat digunakan untuk mengalokasikan array yang digunakan untuk melakukan pembangkitan integer acak. Sehingga banyak elemen array integer ditentukan dengan menggunakan nilai konstan <b>ARRAY_SIZE</b> yang terdapat pada bagian awal kode program.
## Pembagian tugas:
13516003 - Perbaikan program paralel dan format keluaran
13516027 - Inisiasi program sekuensial dan paralel
Pengujian:
### Deskripsi solusi paralel. Berikan ilustrasi jika perlu.
Solusi paralel yang dibuat adalah dengan membagi pekerjaan sekuensial ke dalam beberapa proses untuk dilakukan secara paralel.
Untuk melakukan eksekusi pada <i>device</i> (GPU), data array pada <i>host</i> (CPU) harus disalin menggunakan <i>cudaMemcpy</i>.
Pekerjaan yang dibagi adalah:
1. Pembangkitan nilai acak pada array menggunakan <i>cudaRand</i>.
2. Pencarian nilai maksimum untuk menentukan digit terbesar diantara elemen array. Pencarian dilakukan dengan pararel yang direduksi, menggunakan <i>CUDA threads</i>.
3. Perhitungan kemunculan angka pada setiap digit. Pembagian dilakukan dengan mengelompokkan masing-masing elemen array kepada digit tertentu menggunakan <i>CUDA threads</i>, kemudian masing-masing thread menggabungkan hasil perhitungan ke dalam sebuah <i>bucket</i> global (yang menyimpan seluruh kemunculan digit) dengan memanfaatkan <i>atomicAdd</i> sebagai implementasi dari <i>critical section</i>.
Setelah perhitungan kemunculan angka telah digabung, array pada <i>device</i> disalin ke array pada <i>host</i> untuk dilakukan pemetaan elemen array berdasarkan kemunculan angka pada digit yang sedang diperiksa.
Lalu pengulangan dilakukan dari digit terkecil hingga digit terbesar.
### Analisis solusi yang anda berikan. Apakah mungkin terdapat solusi yang memberikan kinerja lebih baik?
Solusi yang dibuat sudah membagi pekerjaan yang harusnya dapat mempercepat kinerja.
Contohnya apabila terdapat 100 elemen array dan maka sebanyak 50 <i>CUDA thread</i> digunakan untuk melakukan 1 kali perbandingan elemen, berbeda dengan eksekusi di <i>host</i> yang harus melakukan perbandingan sebanyak 100 kali menggunakan 1 CPU thread. Waktu perhitungan kemunculan angka pada setiap digit juga tereduksi karena setiap <i>CUDA thread</i> melakukan pengelompokkan digit untuk setiap elemen pada array.
Tetapi tentu saja tidak menutup kemungkinan terdapat solusi lain yang lebih cepat. Untuk pemetaan elemen array yang dilakukan oleh proses utama, mungkin saja dapat diparalelkan, tetapi algoritma yang telah dibuat tidak menerapkannya.
### Jumlah thread yang digunakan. Kenapa anda memilih angka tersebut?
Thread yang digunakan untuk menentukan nilai maksimum pada array adalah sebanyak <i>N / 2</i>, dengan <i>N</i> adalah banyak elemen array. Hal ini dilakukan karena dengan algoritma yang digunakan, setiap thread melakukan perbandingan satu elemen array dengan satu elemen lainnya.
Thread yang digunakan untuk melakukan sorting pada array adalah sebanyak <i>N</i>. Setiap thread bertugas untuk mengelompokkan setiap elemen array pada <i>bucket</i> digit yang ada.
### Pengukuran kinerja untuk tiap kasus uji (jumlah N pada array) dibandingkan dengan radix sort serial.
Pengukuran dilakukan dengan menjalankan program paralel yang telah dibuat dengan pengubahan <b>ARRAY_SIZE</b> sesuai dengan <i>N</i> yang akan diuji. Waktu pengujian dirata-rata dari 3 kali percobaan.
#### N = 5000
Serial : The sorting process took 1325 microseconds to run.
Paralel : The sorting process took 2684 microseconds to run.
#### N = 50000
Serial : The sorting process took 16312 microseconds to run.
Paralel : The sorting process took 16504 microseconds to run.
#### N = 100000
Serial : The sorting process took 23058 microseconds to run.
Paralel : The sorting process took 22182 microseconds to run.
#### N = 200000
Serial : The sorting process took 42182 microseconds to run.
Paralel : The sorting process took 38141 microseconds to run.
#### N = 400000
Serial : The sorting process took 79765 microseconds to run.
Paralel : The sorting process took 63011 microseconds to run.
#### Analisis perbandingan kinerja serial dan paralel. Analisis yang diharapkan adalah analisis yang minimal dapat menjelaskan setiap hasil pengukuran kinerja sebelumnya.
Pembagian kerja secara paralel belum cukup optimal karena dapat dilihat untuk parameter <b>N</b> yang kecil, waktu eksekusi paralel lebih lama dibandingkan dengan waktu eksekusi serial. Program dapat dioptimasi dengan mengubah algoritma dalam memetakan elemen array setelah perhitungan kemunculan angka pada setiap digit (memanfaatkan proses selain proses utama). Dan mungkin perlu dianalisis lebih lanjut mengenai <i>stride</i> pada algoritma untuk dapat memanfaatkan pengaksesan memori yang lebih efisien.
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