diff --git a/README.md b/README.md
index 3acc7748b702cbcb7b51bd1fc25fcea9a8b419f4..4af0e93cdab7728701b2726a15008a292c0271e1 100644
--- a/README.md
+++ b/README.md
@@ -2,33 +2,95 @@
 
 ## Semester II Tahun 2021/2022
 
-### Tugas Besar 1 IF3230 Sistem Paralel dan Terdistribusi
-
+### Tugas Besar 2 IF3230 Sistem Paralel dan Terdistribusi
 *Program Studi Teknik Informatika* <br />
 *Sekolah Teknik Elektro dan Informatika* <br />
 *Institut Teknologi Bandung* <br />
 
 *Semester II Tahun 2021/2022*
 
-## Description
-
+## Deskripsi
 Program paralel yang menerima satu matriks kernel dan n buah matriks masukan. Program akan melakukan operasi konvolusi matriks pada matriks kernel dan setiap matriks masukan untuk menghasilkan matriks hasil konvolusi. Setelah itu, program Anda akan membuat n bilangan bulat positif yang merupakan selisih elemen terbesar dan terkecil dari setiap matriks hasil konvolusi, serta melakukan sorting dari n bilangan tersebut.
-Keluaran program Anda adalah nilai maksimum, nilai minimum, median, dan rata-rata n bilangan tersebut. Nilai median dan rata-rata dihitung menggunakan integer division untuk pembulatan. Program harus dibuat secara parallel dengan memanfaatkan OpenMPI (untuk komunikasi antar mesin) dan OpenMP (untuk melakukan multithreading)
+Keluaran program Anda adalah nilai maksimum, nilai minimum, median, dan rata-rata n bilangan tersebut. Nilai median dan rata-rata dihitung menggunakan integer division untuk pembulatan. Program harus dibuat secara parallel dengan memanfaatkan CUDA (digunakan untuk melakukan perhitungan konvolusi, mencari datarange, dan melakukan sorting data).
 
 ## Author
-
 1. [Muhammad Azhar Faturahman (13519020)](https://github.com/azharfatrr)
 2. [Gde Anantha Priharsena (13519026)](https://github.com/gdeananthap)
 3. [Reihan Andhika Putra (13519043)](https://github.com/AndhikaRei)
 
 ## Resources
-
 [Google Colaboratory](https://colab.research.google.com/drive/17W09R-Vo0bf_k3r5APhE8ozb5lHHPaQl)
 
 ## Requirements
 
 - [C](https://www.gnu.org/software/gcc/gcc.html)
-- [OpenMPI](https://www.open-mpi.org/)
-- [OpenMP](https://openmp.org/)
+- [CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit)
+
+## Installation
+1. Compile program dan library dengan menggunakan [make](https://www.gnu.org/software/make/):
+
+    ```bash
+    make install-serial
+    make install-parallel
+    ```
+
+2. Jika tidak bisa menggunakan make, silahkan menggunakan membuka makefile dan compile program secara manual seperti yang ada di dalam file tersebut.
+
+### Running on Local
+
+Jalankan semua testcase dengan menggunakan perintah:
+
+```bash
+make TC-generic
+```
+   
+
+Hasil semua testcase akan disimpan dalam folder result.
+
+### Running Google Collab
+1. Bukalah google collab di link yang ada di bagian resources.
+2. Pastikan runtime yang dipakai adalah runtime `GPU`. Pilihlah menu runtime yang ada di navbar lalu pilih `Ubah jenis runtime`, pilihlah runtime GPU.
+3. Pada menu `runtime` pilihlah `Jalankan semua`
+4. Google collab akan melakukan instalasi dependency, mendownload testcase, dan melakukan run-program secara otomatis.
+5. Apabila program sudah selesai berjalan, harusnya hasil dari program paralel akan ditampilkan.
+
+## Cara Kerja Program
+1. Lakukan pembacaan matrix input, matrix kernel, dan parameter lainnya. Lakukan alokasi memory secara lokal untuk menyimpan variabel-variabel tersebut.
+2. Lakukan inisialisasi dan alokasi memory untuk variabel yang akan disimpan di device. Variabel-variabel yang akan dialokasikan di device adalah:
+- d_arr_mat_rm : Matrix input
+- d_out_mat_rm : Matrix keluaran
+- d_kernel_rm  : Matrix kernel
+- d_arr_range  : Matrix datarange
+3. Ubahlah semua variabel matrix yang ada di local (host) menjadi bentuk 1 dimensi (row-major).
+4. Lakukan copy input matrix dan kernel dari local (host) ke device (gpu) dan set nilai awal untuk d_out_mat_rm dan d_arr_range 0.
+5. Panggil kernel dan lakukan operasi konvolusi di device(gpu). Satu thread akan melakukan satu operasi konvolusi. Satu baris blok akan menangani satu matrix. Dalam satu baris blok bisa terdapat beberapa kolom blok tergantung jumlah operasi yang dibutuhkan.
+6. Masukkan hasil operasi konvolusi pada d_out_mat_rm.
+7. Setelah operasi konvolusi di GPU selesai maka lakukan copy memori dari device(gpu) ke host(lokal) dari variabel d_out_mat_rm ke out_mat_rm.
+8. Panggil kernel dan lakukan operasi penghitungan data range di device(gpu). Satu baris blok akan menangani operasi datarange untuk satu matriks. Hanya terdapat satu kolom blok. Dalam satu blok hanya memerlukan satu thread.
+9. Masukkan hasil operasi datarange pada d_arr_range.'
+10. Setelah operasi datarange di gpu selesai maka lakukan copy memori dari device(gpu) ke host(lokal) dari variabel d_arr_range ke arr_range.
+11. Setelah semua matriks konvolusi dan datarange matriks dihitung di setiap threads block dan thread, maka selanjutnya datarange yang sudah dihitung tersebut akan disort secara parallel. Algoritma sorting yang digunakan adalah [Bitonic Sort](https://en.wikipedia.org/wiki/Bitonic_sorter). Pertimbangan memilih Bitonic Sort sebagai algoritma yang digunakan didasarkan pada kemudahan untuk diimplementasikan secara parallel dan juga tergolong cepat dengan komplesitas algoritma [log^2 n].
+12. Perhitungan sorting dilakukan pada beberapa thread block yang terdiri atas beberapa thread. Sehingga arr_range perlu dicopy ke device memory kembali. Setiap thread bertanggung jawab memegang nilai data_range dan juga melakukan operasi sorting.
+13. Setelah selesai disort, maka data_range dapat dioperasikan untuk mencari nilai minimal, maksimal, median, dan rata-rata.
+
+## Analisis Waktu Tercepat Program Parallel dan Serial
+Berikut ini merupakan tabel perbandingan waktu eksekusi serial dan waktu eksekusi paralel terbaik
+|No.|Test Case|Waktu Eksekusi Serial|Waktu Eksekusi Paralel|
+|--|--|--|--|
+|1|TC 1|0.009391 s|0.149735 s|
+|2|TC 2|0.765009 s|0.261487 s|
+|3|TC 3|0.804326 s|0.355731 s|
+|4|TC 4|9.918001 s|1.735946 s|
+
+Waktu eksekusi program dengan skema paralel **lebih cepat** daripada skema serial pada kasus TC2, TC3, dan TC4. Hal ini disebabkan karena pada skema paralel, matriks masukan didistribusikan pada beberapa thread block dan kemudian dihitung secara bersamaan dengan setiap thread bertanggung jawab menghitung hasil element matriks konvolusi. Sehingga, perhitungan akan jauh lebih cepat daripada secara serial.
+
+## Analisis Hasil Program Parallel dan Serial
+**Tidak ada perbedaan** antara hasil program serial dan program paralel. Perbedaan keduanya hanya terdapat pada waktu eksekusinya.
+
+### Studi Kasus
+Berikut merupakan 3 kasus yang akan dianalisis
+1. Jumlah Matrix: 10000, Ukuran Kernel: 1x1, Ukuran Matrix: 1x1
+2. Jumlah Matrix: 1, Ukuran Kernel: 1x1, Ukuran Matrix: 100x100
+3. Jumlah Matrix: 1, Ukuran Kernel: 100x100, Ukuran Matrix: 100x100
 
-## Installation
\ No newline at end of file
+Berdasarkan skema paralelisasi yang kami buat, waktu eksekusi yang paling cepat adalah **kasus yang pertama**. Hal ini dikarenakan setiap thread yang dibuat akan melakukan 1 perhitungan konvolusi. Semakin besar ukuran matrix akan memperbanyak jumlah perhitungan dalam sebuah perhitungan konvolusi. Semakin banyak perhitungan dalam sebuah perhitungan konvolusi maka semakin memperlama waktu perhitungan dalam sebuah thread yang juga memperlama proses perhitungan pada keseluruhan threadnya. Oleh karena itu, skema paralelisasi yang kami buat akan membuat 10000 thread yang berbeda dan melakukan proses perhitungan konvolusi untuk matrix input dengan 1x1 dan matrix kernel dengan 1x1 yang cukup cepat. Sehingga waktu eksekusinya akan jauh lebih cepat dibandingkan kedua kasus lainnya.
\ No newline at end of file