From e506404e720aae4a62a11460469e4bfd1323361d Mon Sep 17 00:00:00 2001
From: sy-anwar <13517139@std.stei.itb.ac.id>
Date: Sun, 1 Mar 2020 21:28:25 +0700
Subject: [PATCH] add timer

---
 Makefile   |   2 +-
 dijkstra.c | 121 ++++++++++++++++++++++++++++-------------------------
 2 files changed, 65 insertions(+), 58 deletions(-)

diff --git a/Makefile b/Makefile
index 18a876a..36f3b48 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ GCC = gcc
 DJ = ./dijkstra
 
 run : compile dijkstra
-	@read -p "Jumlah Nodes : " node && ${DJ} 4 $$node > answer.txt
+	@read -p "Jumlah Thread, Nodes : " thread node && ${DJ} $$thread $$node > answer.txt
 
 compile: dijkstra.c
 	${GCC} -g -Wall -o dijkstra dijkstra.c -fopenmp
\ No newline at end of file
diff --git a/dijkstra.c b/dijkstra.c
index f42ef74..3892ed2 100644
--- a/dijkstra.c
+++ b/dijkstra.c
@@ -1,5 +1,5 @@
-#include <limits.h> 
-#include <stdio.h> 
+#include <limits.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <omp.h>
 
@@ -7,33 +7,33 @@
 #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 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; 
+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; 
+  dist[src] = 0;
 
-	for (int count = 0; count < num_vertex - 1; count++) { 
-		int u = minDistance(dist, sptSet, num_vertex); 
+  for (int count = 0; count < num_vertex - 1; count++) {
+    int u = minDistance(dist, sptSet, num_vertex);
 
-		sptSet[u] = true; 
+    sptSet[u] = true;
 
-		for (int v = 0; v < num_vertex; v++) 
+    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]; 
-	} 
+      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);
@@ -42,7 +42,7 @@ int* dijkstra(int** graph, int src, int num_vertex) {
   }
 
   return result;
-} 
+}
 
 int** InitMatrix(int num_nodes) {
   int** adj_matrix;
@@ -55,14 +55,14 @@ int** InitMatrix(int num_nodes) {
 
 void RandomMatrix(int** adj_matrix, int num_nodes) {
   srand(13517001);
-  // init distance 
+  // 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;      
+        adj_matrix[i][j] = 0;
       } else {
           adj_matrix[i][j] = rand() % 100;
-		  adj_matrix[j][i] = adj_matrix[i][j];
+      adj_matrix[j][i] = adj_matrix[i][j];
       }
     }
   }
@@ -70,14 +70,14 @@ void RandomMatrix(int** adj_matrix, int num_nodes) {
 
 int random_matrix(int*** adj_matrix, int num_nodes) {
   srand(13517001);
-  // init distance 
+  // 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;      
+        (*adj_matrix)[i][j] = 0;
       } else {
         (*adj_matrix)[i][j] = rand() % 100;
-		    (*adj_matrix)[j][i] = (*adj_matrix)[i][j];
+        (*adj_matrix)[j][i] = (*adj_matrix)[i][j];
       }
     }
   }
@@ -87,9 +87,9 @@ int random_matrix(int*** adj_matrix, int num_nodes) {
 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("%d\t", (*adj_matrix)[i][j]);
     }
-	  printf("\n");
+    printf("\n");
   }
   return 0;
 }
@@ -105,7 +105,7 @@ int malloc2dint(int ***array, int n, int m) {
     return -1;
   }
 
-  for (int i = 0; i < n; i++) 
+  for (int i = 0; i < n; i++)
     (*array)[i] = &(p[i*m]);
 
   return 0;
@@ -122,9 +122,9 @@ int free2dint(int ***array) {
 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("%d\t", adj_matrix[i][j]);
     }
-	printf("\n");
+  printf("\n");
   }
 }
 
@@ -143,32 +143,39 @@ void debug(int x) {
 void Hello(void); /* Thread function */
 
 int main(int argc, char *argv[]) {
-   int nodes_count = strtol(argv[2], NULL, 10);
+  int nodes_count = strtol(argv[2], NULL, 10);
 
-   int** adj_matrix;
-   int** result_matrix;
-   result_matrix = InitMatrix(nodes_count);
-   adj_matrix = InitMatrix(nodes_count);
-   RandomMatrix(adj_matrix, nodes_count);
+  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);
-   
-   #pragma omp parallel num_threads(4)
-   #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;
+  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);
-    FreeMatrix(adj_matrix, nodes_count);
-    FreeMatrix(result_matrix, nodes_count);
-    return 0;
+  printf("~=== Hasil ===~\n");
+  PrintMatrix(result_matrix, nodes_count);
+  end = omp_get_wtime();
+  printf("time: %Lf microsecond(s)", (end - start)*1000000);
+  FreeMatrix(adj_matrix, nodes_count);
+  FreeMatrix(result_matrix, nodes_count);
+  return 0;
 }
 
 void Hello(void) {
-- 
GitLab