From 3321d88dadd00ad5fddab8f4c32a6fd61c5fcc71 Mon Sep 17 00:00:00 2001
From: Restu Wahyu Kartiko <13516155@std.stei.itb.ac.id>
Date: Thu, 11 Apr 2019 21:07:16 +0700
Subject: [PATCH] Add readme and output file

---
 README.md      | 83 +++++++++++++++++++++++++++++++++++++++++++++++++-
 test/README.md |  3 --
 test/output    | 69 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 151 insertions(+), 4 deletions(-)
 delete mode 100644 test/README.md
 create mode 100644 test/output

diff --git a/README.md b/README.md
index 89fda07..63bf3fc 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,83 @@
-# CUDA
+# Radix Sort
 
+Tugas OpenMPI - Radix Sort. Praktikum2_K02_13516128_13516032
+
+## Petunjuk penggunaan program
+
+1. Buka terminal, jalankan make
+```
+$ make
+  ```
+2. Untuk menjalankan program, jalankan
+```
+$ ./radix_sort <N> dengan N adalah jumlah elemen array
+```
+
+## Pembagian tugas
+
+| NIM      | Nama          | Tugas                              |
+| -------- | ------------- | ---------------------------------- |
+| 13516032 | Ridho Pratama | radix sort, cuda          |
+| 13516155 | Restu Wahyu Kartiko | Testing, input output, readme |
+
+## Laporan
+
+### Deskripsi solusi paralel
+Algoritma radix sort yang digunakan disini agak berbeda dengan radix sort yang ada di contoh. Jika di contoh penjelasan tugas algoritma radix sort mengurutkan berdasarkan nilai tiap digit, disini yang kami gunakan adalah dengan mengurutkan tiap bit pada representasi binary setiap elemen array. 
+
+- Pertama kami menentukan flag bit ke i pada setiap elemen array (0 atau 1) 
+- Membuat array baru, reverse flag. Jika nilai pada flag 1, maka pada reverse bernilai 0, dan sebaliknya
+- Menghitung histogram kemunculan bit 0 dan 1
+- Membuat prefix sum untuk flag dan reverse flag
+- Menentukan index baru untuk setiap elemen pada array
+- Index baru ditentukan dengan menambahkan nilai histogram untuk nilai bit ke i elemen ke j array dengan prefix sum reverse flag ke j.
+
+Proses paralel dilakukan saat perhitungan flag, reverse flag, prefix sum, histogram, dan perhitungan index baru.
+
+### Analisis solusi
+
+Solusi sekarang memungkinkan program untuk menjalankan sorting lebih cepat dibandingkan dengan proses serial. Hal ini akan di jelaskan pada tabel di bab selanjutnya. 
+Perhitungan flag, reverse flag, prefix sum, dan perhitungan index baru dapat dipercepat dengan dijalankan secara paralel. Namun, untuk perhitungan histogram, walaupun pada implementasi dilakukan secara paralael, namun sebenernya mirip dengan dilakukan secara serial karena menggunakan atomic add dari CUDA dimana fungsi tersebut menambahkan nilai pada sebuat resource global tanpa boleh diganggu dengan proses lain. Jika kita bisa benar-benar memparalelkan proses perhitungan histogram, maka proses akan berjalan sedikit lebih cepat.
+Selain itu, ada satu cara lagi untuk mempercepat proses pengurutan radix sort. Jika pada algoritma yang kami gunakan, pencarian flag dilaukan pada tiap bit. Jika kita bisa melakukan pencarian flag sekali langsung 2 atau 4 bit, maka proses akan menjadi lebih cepat karena iterasi akan berkurang.
+
+**Solusi kinerja yang lebih baik**
+
+#### Jumlah proses, pengujian dengan 5000 data
+
+| p   | Percobaan 1 | Percobaan 2 | Percobaan 3 | Avg       |
+| --- | ----------- | ----------- | ----------- | --------- |
+| 1   | 7.886.116   | 7.031.364   | 7.225.447   | 7.380.975 |
+| 2   | 5.820.907   | 5.038.785   | 5.139.077   | 5.347.923 |
+| 4   | 8370137 | 8375228 | 8404319 | 4.109.141 |
+| 8   | 9385675 | 9405848 | 4.281.710   | 4.599.084 |
+
+Dari data diatas, untuk pengukuran kerja kami menggunakan jumlah proses 4 karena terlihat lebih maksimal.
+4 proses juga adalah jumlah defaul proses yang dijalankan saat menjalankan `mpirun` tanpa menentukan jumlah proses.
+
+#### Pengukuran kinerja
+Berikut adalah hasil dari pengukuran kinerja dengan jumlah elemen 5.000, 50.000, 100.000, 200.000, dan 400.000. Setiap pengujian dilakukan sebanyak 3 kali dan dihitung rata-ratanya. 
+
+
+| N       | Percobaan 1 | Percobaan 2 | Percobaan 3 | Avg       | Serial    | Speedup |
+| ------- | ----------- | ----------- | ----------- | --------- | --------- | ------- |
+| 5.000   | 178.765     | 156.628     | 150.515     | 161.969   | 65.573    | 0.40    |
+| 50.000  | 623.373     | 678.248     | 639.913     | 646.980   | 973.833   | 1.52    |
+| 100.000 | 1.139.981   | 1.198.428   | 1.112.751   | 1.150.386 | 1.886.436 | 1.64    |
+| 200.000 | 2.174.736   | 2.397.348   | 2.455.534   | 2.342.539 | 3.756.605 | 1.60    |
+| 400.000 | 4.022.905   | 4.237.897   | 4.066.621   | 4.109.141 | 7.380.975 | 1.80    |
+
+#### Analisis perbandingan kinerja
+Pada percobaan  terlihat bahwa speedup cenderung semakin tinggi ketika problem size ditingkatkan. 
+Dan juga efisiensi. 
+Hal ini dikarenakan peningkatan ``T``<sub>overhead</sub> lebih kecil dibandingkan dengan ``T``<sub>serial</sub>.
+Oleh karena itu, semakin besar problem size, speedup cenderung meningkat, namun tidak akan lebih dari ``p`` kali.
+(``p`` banyaknya proses yang digunakan) 
+(``T``<sub>paralel</sub> = ``T``<sub>serial</sub>/``p`` + ``T``<sub>overhead</sub>)
+(speedup = ``T``<sub>serial</sub>/``T``<sub>paralel</sub>)
+
+Pada uji coba problem size 5000, didapatkan bahwa waktu serial justru lebih cepat dibandingkan dengan waktu paralel. Hal ini dikarenakan, proses yang dilakukan untuk melakukan message passing lebih besar dibandingkan dengan operasi sort dan merge yang terjadi, sehingga overhead akibat message passing ini dapat menyebabkan speedup yang berkurang drastis.
+
+### References
+- Slide kuliah IF3230 Sistem Terdistribusi
+- http://mpitutorial.com/tutorials/
+- https://www.geeksforgeeks.org/radix-sort/
\ No newline at end of file
diff --git a/test/README.md b/test/README.md
deleted file mode 100644
index fcb37d9..0000000
--- a/test/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Announcement
-
-Please place your sample input and output here.
\ No newline at end of file
diff --git a/test/output b/test/output
new file mode 100644
index 0000000..5b53916
--- /dev/null
+++ b/test/output
@@ -0,0 +1,69 @@
+// n = 400000
+
+// 1
+Parallel Radix Sort : 11425132
+Serial Radix Sort : 14206280
+
+// 2
+Parallel Radix Sort : 11419351
+Serial Radix Sort : 13934257
+
+// 3
+Parallel Radix Sort : 11433364
+Serial Radix Sort : 13934257
+
+// n = 200000
+
+// 1
+Parallel Radix Sort : 10917660
+Serial Radix Sort : 12391219
+
+// 2
+Parallel Radix Sort : 10925651
+Serial Radix Sort : 12662192
+
+// 3
+Parallel Radix Sort : 10885625
+Serial Radix Sort : 11902401
+
+// n = 100000
+
+// 1
+Parallel Radix Sort : 10308169
+Serial Radix Sort : 10911577
+
+// 2
+Parallel Radix Sort : 10312216
+Serial Radix Sort :  11499630
+
+// 3
+Parallel Radix Sort :  10320996
+Serial Radix Sort : 10734967
+
+// n = 50000
+
+// 1
+Parallel Radix Sort : 9945857
+Serial Radix Sort : 10249821
+
+// 2
+Parallel Radix Sort : 9942933 
+Serial Radix Sort : 10099866
+
+// 3
+Parallel Radix Sort : 9966641
+Serial Radix Sort : 10103580
+
+// n = 5000
+
+// 1
+Parallel Radix Sort : 8148786
+Serial Radix Sort : 9801868
+
+// 2
+Parallel Radix Sort : 8157402
+Serial Radix Sort : 9540459
+
+// 3
+Parallel Radix Sort : 8182279 
+Serial Radix Sort : 9388756
\ No newline at end of file
-- 
GitLab