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
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