|13517050 | Christopher Billy Setiawan | Paralelisasi, Makefile, Laporan|
|13517131 | Jan Meyer Saragih | Paralelisasi, |
|13517131 | Jan Meyer Saragih | Paralelisasi, File save, Laporan|
## <u>Deskripsi Solusi</u>
Solusi paralel yang dikerjakan adalah dengan membagi tugas algoritma Djikstra. Jadi processor menerima sejumlah node yang harus diberikan hasil dari algoritma dijkstra-nya. Hasilnya diberikan kepada node root yang nanti akan mengumpulkan semua hasilnya dan dituliskan ke dalam file.
Jadi paralelisasi yang dilakukan adalah paralelisasi data (*data parallelism*). Alasannya adalah data dibagi-bagi kepada processor-processor yang ada untuk diproses sebelum dikumpulkan kembali di node master untuk dituliskan ke file.
Solusi paralel yang dikerjakan adalah paralelisasi data (*data parallelism*). Alasannya adalah data dibagi-bagi kepada thread-thread yang ada untuk diproses.
File yang dihasilkan ada 2 buah:
-*graph.txt* yang merupakan file yang berisi graph yang di-*generate*
-*result.txt* yang merupakan hasil algoritma Dijkstra.
Solusi dilakukan pertama kali dengan meng-*generate* graph pada setiap processor. Graph yang dihasilkan pada tiap processor pasti sama dikarenakan seed untuk srand yang sama.
Jadi, setelah semua graph selesai di-*generate*, maka perhitungan waktu dimulai. Waktu hanya dihitung dari node ke-0.
Pembagian tugas setiap node adalah sebagai berikut:
- Node 0 (*root*) berfungsi sebagai node yang menerima semua hasil perhitungan Dijkstra dari node lain
- Node lain berfungsi untuk menjalankan algoritma Dijkstra, lalu mengirimkan hasilnya di node root.
Jadi terdapat (n - 1) node yang mengerjakan algoritma Dijkstra disebabkan karena node *root* hanya menerima hasil eksekusi Dijkstra. Setelah semua hasil dari Dijkstra diterima oleh node *root*, maka hasilnya akan dituliskan pada file *result.txt*.
Solusi dilakukan pertama kali dengan meng-*generate* graph. Setelah itu, perhitungan waktu dimulai. Waktu hanya dihitung dari node ke-0. Setiap thread berfungsi untuk menangani sejumlah {jumlah size} / {jumlah thread} proses Dijkstra. Dengan demikian, setiap thread melakukan algortima Dijkstra.
Setelah semua proses Dijkstra diselesaikan oleh setiap thread, maka hasilnya akan dituliskan pada file *result.txt*.
Terdapat pengecualian, yaitu saat jumlah node hanya 1. Di saat seperti itu, maka cara solusi yang digunakan adalah dengan menggunakan Dijkstra serial.
## <u>Analisis Solusi</u>
Kelebihan dari solusi ini adalah:
- Dipastikannya ada node yang menerima hasil MPI_Send. Dengan demikian, setiap hasil MPI_Send yang diberikan oleh node selain *root* pasti ditangani oleh node *root*.
- Lebih cepat setup karena graph sudah diinstansiasi terlebih dahulu dan tidak menggunakan malloc untuk graph awal dan graph solusi.
- Dari segi proses, lebih hemat pada sisi memori karena melakukan malloc dan free.
- Waktu lebih cepat daripada proses yang membutuhkan malloc dan free
- Membagi task sama rata kepada setiap thread
Kelemahan dari solusi ini adalah:
- Utilisasi processor yang tidak maksimal.
- Boros memori saat setup (graph yang digunakan pasti berukuran 3000 x 3000 karena sudah diset dari awal), tidak menggunakan malloc dan free.
- Tidak terlalu cepat dalam prosesnya karena malloc digunakan pada passing parameter di MPI_Send dan MPI_Receive.
- Graph dibuat oleh semua processor (tidak menggunakan MPI_Broadcast untuk graph).
- Utilisasi memori yang tidak maksimal.
- Tidak melakukan paralelisasi dalam proses Dijkstra (*task parallelism*), hanya *data parallelism*
Terdapat beberapa perbaikan yang dapat dilakukan, yaitu:
- Melakukan inisiasi graph di node master dan melakukan broadcast untuk diterima di node lain.
- Menggunakan malloc (jika ingin keseluruhan setup dan proses hemat memori) atau menggunakan array untuk passing parameter MPI_Send (jika ingin kecepatan setup dan proses cepat)
- Melakukan paralelisasi task di Dijkstra. Paralelisasi ini sebenarnya lebih baik namun tidak terlalu berefek. Hal ini disebabkan jumlah processor yang memproses Dijkstra tidak sebanyak jumlah value yang sedang dihitung.
- Menggunakan malloc untuk inisasi graph dan result. Dengan demikian, akan menghemat memori.
- Melakukan paralelisasi task di Dijkstra. Paralelisasi ini sebenarnya lebih baik namun tidak terlalu berefek. Hal ini disebabkan jumlah thread yang memproses Dijkstra tidak sebanyak jumlah value yang sedang dihitung.
## <u>Jumlah thread yang digunakan</u>
Setelah pengujian yang dilakukan berulang-ulang, kami memutuskan untuk menggunakan 6 thread pada tugas ini. karena dapat dilihat dari hasil pengujian yang dilakukan, waktu terefisien dapat terlihat di pengujian paralel dengan 6 thread. Kenapa angka 6? karena tugas ini hanya memungkinkan untuk memecah task menjadi 6 proses karena hanya tersedia 6 VM instance.
## Analisis Perbandingan Kinerja Serial dan Paralel
Kami tidak melakukan pengukuran paralel dengan processor berjumlah 2, 3, 4, dan 5 untuk jumlah node = 3000 dikarenakan node 6 sudah ditentukan sebagai node terbaik.