Skip to content
Snippets Groups Projects
Commit a018367d authored by Farhan Ramadhan's avatar Farhan Ramadhan
Browse files

translate from openmpi to openmp

parent 00ea67a6
Branches
No related merge requests found
GCC = gcc
DJ = ./dijkstra
run : compile dijkstra
@read -p "Jumlah Nodes : " node && ${DJ} 4 $$node > answer.txt
compile: dijkstra.c
${GCC} -g -Wall -o dijkstra dijkstra.c -fopenmp
\ No newline at end of file
This diff is collapsed.
sshpass -p "9M6J2TB" ssh 13517001@167.205.35.150
\ No newline at end of file
dijkstra 0 → 100755
File added
#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);
int** adj_matrix;
int** result_matrix;
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;
// 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;
}
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);
}
test 0 → 100755
File added
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment