From 06b765bc752d21e241c1cd8d16125fea6b02086e Mon Sep 17 00:00:00 2001
From: Aldo <13516003@std.stei.itb.ac.id>
Date: Thu, 11 Apr 2019 21:16:00 +0700
Subject: [PATCH] Add readme

---
 README.md | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)
 create mode 100644 README.md

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..91a774a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,81 @@
+### 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.
-- 
GitLab