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.
Johanes Boas Badia - 13517009 - Fungsi matrixToArray, generateRandomArray, printMatrix, printArrayTerminal, doAllDijkstra, main
Timothy - 13517087 - Fungsi matrixToArray, generateRandomArray, printMatrix, printArrayTerminal, doAllDijkstra, main
- Johanes Boas Badia - 13517009 - Fungsi matrixToArray, generateRandomArray, printMatrix, printArrayTerminal, doAllDijkstra, main
- Timothy - 13517087 - Fungsi matrixToArray, generateRandomArray, printMatrix, printArrayTerminal, doAllDijkstra, main
## Laporan Pengerjaan
1. Deskripsi solusi paralel
Kami mengimplementasikan fungsi djikstra yang dapat mengeluarkan array yang berisi jarak terdekat
sebuah node tertentu berdasarkan parameter yang diberikan ke seluruh node lain. Penyelesaian secara
paralel dilakukan dengan membagi perhitungan djikstra tersebut ke seluruh host yang tersedia. Host
Root akan membagi pekerjaan sebesar jumlah node / jumlah host. Setelah perhitungan selesai dilakukan,
seluruh host akan mengembalikan hasil perhitungan dalam bentuk array melalui pemanggilan fungsi MPI_Gather.
Kami mengimplementasi fungsi doAllDijkstra yang akan melakukan algoritma Dijkstra untuk semua node.
Kami menggunakan *block size* berukuran 256 dan jumlah block sebesar (N + *block size* - 1) / *block size*
dengan N adalah jumlah node. Pertama, akan dilakukan cudaMallocManaged untuk
melakukan alokasi matrix random berisi jarak antar semua node dan matrix hasil.
Kemudian, akan dilakukan iterasi untuk semua node dan dilakukan dijkstra. Iterasi akan dilakukan
dengan cara
```cpp
int index = blockIdx.x * blockDim.x + threadIdx.x;
int stride = blockDim.x * gridDim.x;
for(int i= index; i < num_of_node; i += stride){
...
}
```
iterasi akan dimulai dari ```blockIdx.x * blockDim.x + threadIdx.x``` yang akan mencari thread
dan akan loncat sebanyak ```blockDim.x * gridDim.x```
2. Analisis Solusi
Solusi yang kami berikan pada permasalahan kali ini belum merupakan solusi paling optimal yang dapat dibuat.
Salah satu cara untuk meningkatkan efisiensi pengerjaan adalah dengan membagi perhitungan sebuah host ke
beberapa thread terpisah agar perhitungan dapat diselesaikan dengan lebih cepat. Selain itu, kekurangan solusi
yang kami tawarkan adalah jika terdapat sisa pembagian pekerjaan, sisa pekerjaan tersebut akan dikerjakan
sepenuhnya oleh host root. Hal ini menyebabkan pembagian pekerjaan menjadi tidak merata.
Program yang kami buat hanya memanfaatkan satu thread untuk perhitungan dijkstra. Jadi, salah satu cara untuk meningkatkan efisiensi pengerjaan
adalah dengan menjalankan dijkstra secara paralel.
3. Jumlah Thread yang digunakan
Pada pengerjaan kali ini, jumlah thread yang digunakan adalah satu thread untuk setiap node host. Alasan pemilihan
jumlah ini adalah untuk mempermudah implementasi pengerjaan program.
Pada pengerjaan kali ini, jumlah thread yang digunakan adalah satu thread untuk setiap perhitungan djikstra,
dan 256 saat menjalanakan perhitungan dijkstra tersebut secara bersamaan. Alasan pemilihan jumlah ini adalah
untuk mempermudah implementasi pengerjaan program.
4. Pengukuran Kinerja
Dibawah ini adalah hasil kinerja algoritma dijkstra yang dijalankan secara serial.
100 : 12673 microsecond
500 : 981101 microsecond
1000 : 7861553 microsecond
3000 : 227481644 microsecond
| Jumlah Node | Percobaan 1 Paralel | Percobaan 2 Paralel| Percobaan 3 Paralel | Percobaan 1 Serial | Percobaan 2 Serial | Percobaan 3 Serial | Rata-rata Paralel | Rata-rata Serial