From 1a3a7f47683ce36f3682ef5146e843f8e28c1c67 Mon Sep 17 00:00:00 2001 From: Farhan Ramadhan <farhanramadhansk@gmail.com> Date: Sun, 1 Mar 2020 23:23:51 +0700 Subject: [PATCH] edit readme --- README.md | 51 +++++++++++--- src/dijkstra.c | 187 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 229 insertions(+), 9 deletions(-) create mode 100644 src/dijkstra.c diff --git a/README.md b/README.md index f77e0e8..5f28e4d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,44 @@ -# Announcement +# Petunjuk Penggunaan + 1. Compile file dengan perintah `make compile/ make run` + 2. Inputkan jumlah process, nodes, dan file output yang diinginkan + 3. Lihat hasil di file output -Beberapa file yang harus ada dalam repositori tersebut diantaranya: -* Direktori src yang berisi source code yang anda buat. -* File output yang berisi hasil uji dijkstra algorithm pada data uji. -* Makefile. Buatlah sehingga kompilasi program dapat dilakukan hanya dengan pemanggilan command ’make’ saja. -* File README.md yang berisi: - * Petunjuk penggunaan program. - * Pembagian tugas. Sampaikan dalam list pengerjaan untuk setiap mahasiswa. Sebagai contoh: XXXX mengerjakan fungsi YYYY, ZZZZ, dan YYZZ. - * Laporan pengerjaan, dengan struktur laporan sesuai dengan deskripsi pada bagian sebelumnya. +# Pembagian Tugas + * InitMatrix - Syaiful - 13517139 + * RandomMatrix - Farhan - 13517001 + * PrintMatrix - Syaiful - 13517139 + * FreeMatrix - Farhan - 13517001 + * Pragma Omp - Farhan - 13517001 +# Laporan Pengerjaan + * Deskripsi solusi paralel. Berikan ilustrasi jika perlu. + > Solusi paralel dilakukan dengan cara membagi proses sebanyak n nodes ke n process, kemudian tiap proses tersebut dijalankan oleh sejumlah np proses secara paralel dan akan ada matrix global yang akan diakses secara paralel oleh tiap proses, dan kemudian di-print ke output. + + * Analisis solusi yang anda berikan. + Apakah mungkin terdapat solusi yang memberikan kinerja lebih baik? + > Dalam menggunakan library OpenMP ini dalam kasus 100, 500, 1000, 3000 lebih cepat paralel karena pembagian thread lebih mudah dan overhead dari tiap transaksi per thread tidak terlalu besar. + + * Jumlah thread yang digunakan. Kenapa anda memilih angka tersebut? + > Pada lokal prosesnya maksimum sesuai dengan cpu mungkin 2,4, atau 8 sedangkan untuk di server menggunakan 2 karena pada VM ...150, jumlah processnya 2 sehingga lebih baik membagi program sebanyak itu (dapat dari nproc). + + * Pengukuran kinerja untuk tiap kasus uji (jumlah N pada graf) + dibandingkan dengan dijkstra algorithm serial. + > Pada paralel kecepatannya lebih cepat karena dibagi sebanyak prosesnya + - Serial = N * (N^2) + - Paralel = N * (N^2)/N + Pada N = 100 + - Serial > Paralel + Pada N = 500 + - Serial > Paralel + Pada N = 1000 + - Serial > Paralel + Pada N = 3000 + - Serial > Paralel + + + + * Analisis perbandingan kinerja serial dan paralel. + Analisis yang diharapkan adalah analisis yang minimal + dapat menjelaskan setiap hasil pengukuran kinerja sebelumnya. + > Terlihat dari hasil kinerja yang telah dilakukan bahwa waktu pada serial lebih + tinggi karena pada paralel dibagi lagi dengan banyaknya prosesnya.. \ No newline at end of file diff --git a/src/dijkstra.c b/src/dijkstra.c new file mode 100644 index 0000000..74098ee --- /dev/null +++ b/src/dijkstra.c @@ -0,0 +1,187 @@ +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <omp.h> + + +#define true 1 +#define false 0 + +int minDistance(int dist[], int sptSet[], int num_vertex) { + int min = INT_MAX, min_index; + for (int v = 0; v < num_vertex; v++) + if (sptSet[v] == false && dist[v] <= min) + min = dist[v], min_index = v; + return min_index; +} + +int* dijkstra(int** graph, int src, int num_vertex) { + int dist[num_vertex]; + int sptSet[num_vertex]; + for (int i = 0; i < num_vertex; i++) + dist[i] = INT_MAX, sptSet[i] = false; + + dist[src] = 0; + + for (int count = 0; count < num_vertex - 1; count++) { + int u = minDistance(dist, sptSet, num_vertex); + + sptSet[u] = true; + + for (int v = 0; v < num_vertex; v++) + + if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX + && dist[u] + graph[u][v] < dist[v]) + dist[v] = dist[u] + graph[u][v]; + } + + int* result; + result = malloc(num_vertex * sizeof *result); + for (int i = 0; i < num_vertex; i++) { + result[i] = dist[i]; + } + + return result; +} + +int** InitMatrix(int num_nodes) { + int** adj_matrix; + adj_matrix = malloc(num_nodes * sizeof *adj_matrix); + for(int i = 0; i < num_nodes; i++){ + adj_matrix[i] = malloc(num_nodes * sizeof *adj_matrix[i]); + } + return adj_matrix; +} + +void RandomMatrix(int** adj_matrix, int num_nodes) { + srand(13517001); + // init distance + for (int i = 0; i < num_nodes; i++) { + for (int j = i; j < num_nodes; j++) { + if (i == j) { + adj_matrix[i][j] = 0; + } else { + adj_matrix[i][j] = rand() % 100; + adj_matrix[j][i] = adj_matrix[i][j]; + } + } + } +} + +int random_matrix(int*** adj_matrix, int num_nodes) { + srand(13517001); + // init distance + for (int i = 0; i < num_nodes; i++) { + for (int j = i; j < num_nodes; j++) { + if (i == j) { + (*adj_matrix)[i][j] = 0; + } else { + (*adj_matrix)[i][j] = rand() % 100; + (*adj_matrix)[j][i] = (*adj_matrix)[i][j]; + } + } + } + return 0; +} + +int print_matrix(int*** adj_matrix, int num_nodes) { + for (int i = 0; i < num_nodes; i++) { + for (int j = 0; j < num_nodes; j++) { + printf("%d\t", (*adj_matrix)[i][j]); + } + printf("\n"); + } + return 0; +} + +int malloc2dint(int ***array, int n, int m) { + + int *p = (int *)malloc(n*m*sizeof(int)); + if (!p) return -1; + + (*array) = (int **)malloc(n*sizeof(int*)); + if (!(*array)) { + free(p); + return -1; + } + + for (int i = 0; i < n; i++) + (*array)[i] = &(p[i*m]); + + return 0; +} + +int free2dint(int ***array) { + free(&((*array)[0][0])); + + free(*array); + + return 0; +} + +void PrintMatrix(int** adj_matrix, int num_nodes) { + for (int i = 0; i < num_nodes; i++) { + for (int j = 0; j < num_nodes; j++) { + printf("%d\t", adj_matrix[i][j]); + } + printf("\n"); + } +} + +void FreeMatrix(int** adj_matrix, int num_nodes) { + for (int i = 0; i < num_nodes; i++) { + free(adj_matrix[i]); + } + free(adj_matrix); +} + +void debug(int x) { + printf("DEBUG %d >>>\n", x); +} + + +void Hello(void); /* Thread function */ + +int main(int argc, char *argv[]) { + int nodes_count = strtol(argv[2], NULL, 10); + + long double start, end; + int num_thread; + int** adj_matrix; + int** result_matrix; + num_thread = atoi(argv[1]); + result_matrix = InitMatrix(nodes_count); + adj_matrix = InitMatrix(nodes_count); + RandomMatrix(adj_matrix, nodes_count); + // PrintMatrix(adj_matrix, nodes_count); + start = omp_get_wtime(); + // printf("%l\n") + + #pragma omp parallel num_threads(num_thread) + #pragma omp for + for (int i = 0; i < nodes_count; i++) { + /* code */ + // int my_rank = omp_get_thread_num(); + int* temp; + + temp = dijkstra(adj_matrix, i, nodes_count); + result_matrix[i] = temp; + // printf("rank %d do nodes %d\n", my_rank, i); + } + + printf("~=== Hasil ===~\n"); + PrintMatrix(result_matrix, nodes_count); + end = omp_get_wtime(); + printf("time: %Lf microsecond(s)\n", (end - start)*1000000); + FreeMatrix(adj_matrix, nodes_count); + FreeMatrix(result_matrix, nodes_count); + return 0; +} + +void Hello(void) { + int my_rank = omp_get_thread_num(); + int thread_count = omp_get_num_threads(); + + printf("Hello from thread %d of %d\n", my_rank, thread_count); +} + -- GitLab