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