GitLab now enforces expiry dates on tokens that originally had no set expiration date. Those tokens were given an expiration date of one year later. Please review your personal access tokens, project access tokens, and group access tokens to ensure you are aware of upcoming expirations. Administrators of GitLab can find more information on how to identify and mitigate interruption in our documentation.
Beberapa file yang harus ada dalam repositori tersebut diantaranya:
* Direktori src yang berisi source code yang anda buat.
1. Buka terminal
* File output yang berisi hasil uji dijkstra algorithm pada data uji.
2. Pada terminal, ketik "make"
* Makefile. Buatlah sehingga kompilasi program dapat dilakukan hanya dengan pemanggilan command ’make’ saja.
3. Lalu untuk melakukan run, ketik "./radix_sort"
* File README.md yang berisi:
* Petunjuk penggunaan program.
Keterangan:
* Pembagian tugas. Sampaikan dalam list pengerjaan untuk setiap mahasiswa. Sebagai contoh: XXXX mengerjakan fungsi YYYY, ZZZZ, dan YYZZ.
* Laporan pengerjaan, dengan struktur laporan sesuai dengan deskripsi pada bagian sebelumnya.
Nilai N yang diuji diubah pada konstanta N_uji yang terdapat pada program
## Pembagian tugas:
13516150 - Mengerjakan tugas bersama-sama
13516153 - Mengerjakan tugas bersama-sama
## 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 dapat mempercepat kinerja dengan membagi pekerjaan. Ilustrasinya apabila terdapat 50 elemen array, maka sebanyak 25 <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.
Mungkin saja terdapat solusi lain yang lebih cepat. Untuk pemetaan elemen array yang dilakukan oleh proses utama, mungkin saja dapat diparallelkan, tetapi algoritma yang telah dibuat tidak menerapkannya.
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.
### Jelaskan pemetaan thread ke komputasi, dan jumlah thread per block 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.
Untuk pengujian setiap N, perlu pengubahan nilai konstanta N_uji pada program.
#### N = 5000
Serial : Waktu eksekusi: 1825 microseconds
Parallel : Waktu eksekusi: 2575 microseconds
#### N = 50000
Serial : Waktu eksekusi: 17423 microseconds
Parallel : Waktu eksekusi: 17622 microseconds
#### N = 100000
Serial : Waktu eksekusi: 22458 microseconds
Parallel : Waktu eksekusi: 22133 microseconds
#### N = 200000
Serial : Waktu eksekusi: 42411 microseconds
Parallel : Waktu eksekusi: 37665 microseconds
#### N = 400000
Serial : Waktu eksekusi: 79963 microseconds
Parallel : Waktu eksekusi: 62689 microseconds
#### Analisis perbandingan kinerja serial dan paralel. Analisis yang diharapkan adalah analisis yang minimal dapat menjelaskan setiap hasil pengukuran kinerja sebelumnya.
Untuk parameter <b>N</b> yang kecil (pada kasus ini 5000 dan 50000), waktu eksekusi paralel lebih lama dibandingkan dengan waktu eksekusi serial. Ini berarti program perlu dioptimasi dengan mengubah algoritma dalam memetakan array setelah perhitungan kemunculan angka tiap digit. Dan juga perlu dianalisis lebih lanjut mengenai <i>stride</i> pada algoritma untuk dapat memanfaatkan pengaksesan memori yang lebih efisien.