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

edit readme

parent b5598e42
No related merge requests found
# 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: # Pembagian Tugas
* Direktori src yang berisi source code yang anda buat. * InitMatrix - Syaiful - 13517139
* File output yang berisi hasil uji dijkstra algorithm pada data uji. * RandomMatrix - Farhan - 13517001
* Makefile. Buatlah sehingga kompilasi program dapat dilakukan hanya dengan pemanggilan command ’make’ saja. * PrintMatrix - Syaiful - 13517139
* File README.md yang berisi: * FreeMatrix - Farhan - 13517001
* Petunjuk penggunaan program. * Pragma Omp - Farhan - 13517001
* 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.
# 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
#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);
}
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