Skip to content
Snippets Groups Projects
Commit 01817580 authored by Timothy's avatar Timothy
Browse files

add dijkstra function

parent 046d2e5d
No related merge requests found
This diff is collapsed.
No preview for this file type
...@@ -16,6 +16,7 @@ void matrixToArray(unsigned long long **matrix, int node, unsigned long long* re ...@@ -16,6 +16,7 @@ void matrixToArray(unsigned long long **matrix, int node, unsigned long long* re
} }
} }
// __global__
void generateRandomArray(unsigned long long **b, int node){ void generateRandomArray(unsigned long long **b, int node){
srand(13517087); srand(13517087);
for(int i = 0; i < node; i++){ for(int i = 0; i < node; i++){
...@@ -104,79 +105,99 @@ void printArrayTerminal(unsigned long long *arr, int V){ ...@@ -104,79 +105,99 @@ void printArrayTerminal(unsigned long long *arr, int V){
printf("\n"); printf("\n");
} }
//__global__ // __global__
int minDistance(unsigned long long dist[], bool sptSet[], int V){ // void minDistance(unsigned long long dist[], bool sptSet[], int V, int* min_indexx ){
int min = INT_MAX, min_index; // int min = INT_MAX;
for (int v = 0; v < V; v++) // for (int v = 0; v < V; v++)
if (sptSet[v] == false && dist[v] <= min) // if (sptSet[v] == false && dist[v] <= min)
min = dist[v], min_index = v; // min = dist[v], *min_indexx = v;
// }
return min_index;
}
__global__ __global__
void dijkstra(unsigned long long** graph, int src, int V, unsigned long long* result){ void dijkstra(unsigned long long** graph, int src, int V, unsigned long long* result){
// printf("masuk src %d\n", src); printf("masuk src %d\n", src);
bool sptSet[num_of_nodesss] = { 0 }; printf("Hello from block %d, thread %d\n", blockIdx.x, threadIdx.x);
bool sptSet[num_of_nodesss];
int u;
for (int i = 0; i < V; i++) for (int i = 0; i < V; i++)
result[i] = INT_MAX, sptSet[i] = false; result[i] = INT_MAX, sptSet[i] = false;
result[src] = 0; result[src] = 0;
for (int count = 0; count < V - 1; count++) { for (int count = 0; count < V - 1; count++) {
int u = minDistance(result, sptSet, V); //minDistance<<<1,256>>>(result, sptSet, V, &u);
sptSet[u] = true; //add<<<1, 1>>>(N, x, y);
int min = INT_MAX;
for (int v = 0; v < V; v++)
if (sptSet[v] == false && result[v] <= min)
min = result[v], u = v;
sptSet[u] = true;
for (int v = 0; v < V; v++) for (int v = 0; v < V; v++)
if (!sptSet[v] && graph[u][v] && result[u] != INT_MAX if (!sptSet[v] && graph[u][v] && result[u] != INT_MAX
&& result[u] + graph[u][v] < result[v]) && result[u] + graph[u][v] < result[v])
result[v] = result[u] + graph[u][v]; result[v] = result[u] + graph[u][v];
} }
// printf("%llu\n", result[0]);
} }
int main(int argc, char** argv){ // __global__
int num_of_node; // void doAllDijkstra(){
// }
int main(int argc, char** argv)
{
// if(argc != 2){
// fprintf(stderr, "Usage: num_of_node\n");
// exit(1);
// }
// int num_of_node = atoi(argv[1]);
int num_of_node = num_of_nodesss;
if(argc != 2){
printf("insert num of node\n");
exit(1);
}
else{
num_of_node = atoi(argv[1]);
}
unsigned long long **arr; unsigned long long **arr;
unsigned long long *matrixToArrayResult; // unsigned long long *matrixToArrayResult;
matrixToArrayResult = (unsigned long long*) malloc ((num_of_node * num_of_node) * sizeof(unsigned long long)); // matrixToArrayResult = (unsigned long long*) malloc ((num_of_node * num_of_node) * sizeof(unsigned long long));
arr = (unsigned long long **)malloc(num_of_node*sizeof(unsigned long long*));
// arr = (unsigned long long **)malloc(num_of_node*sizeof(unsigned long long*));
cudaMallocManaged(&arr, num_of_node*sizeof(unsigned long long*));
for(int j=0;j<num_of_node;j++){ for(int j=0;j<num_of_node;j++){
arr[j]=(unsigned long long*)malloc(num_of_node*sizeof(unsigned long long)); // arr[j]=(unsigned long long*)malloc(num_of_node*sizeof(unsigned long long));
cudaMallocManaged(&arr[j],num_of_node*sizeof(unsigned long long));
} }
generateRandomArray(arr, num_of_node); generateRandomArray(arr, num_of_node);
// printf("%llu\n",arr[1][0]);
unsigned long long* tempArray;
// tempArray = (unsigned long long *)malloc(num_of_node*sizeof(unsigned long long));
cudaMallocManaged(&tempArray, num_of_node*sizeof(unsigned long long));
unsigned long long **listTempArray; unsigned long long **resultArray;
listTempArray = (unsigned long long **)malloc(num_of_node*sizeof(unsigned long long*)); // resultArray = (unsigned long long **)malloc(num_of_node*sizeof(unsigned long long*));
cudaMallocManaged(&resultArray, num_of_node*sizeof(unsigned long long*));
for(int j=0;j<num_of_node;j++){ for(int j=0;j<num_of_node;j++){
listTempArray[j]=(unsigned long long*)malloc(num_of_node*sizeof(unsigned long long)); // resultArray[j]=(unsigned long long*)malloc(num_of_node*sizeof(unsigned long long));
cudaMallocManaged(&resultArray[j], num_of_node*sizeof(unsigned long long));
}
// double start = omp_get_wtime();
for(int i=0;i<num_of_node;i++){
// dijkstra(arr, i,num_of_node,tempArray);
// printf("%d\n",i);
dijkstra<<<1, 1>>>(arr, i, num_of_node, tempArray);
// printf("%llu\n", tempArray[0]);
for(int j=0;j<num_of_node;j++){
resultArray[i][j] = tempArray[j];
}
} }
cudaDeviceSynchronize();
int process_per_host; // double diff = omp_get_wtime() - start;
process_per_host = num_of_node / num_of_processors; // double msec = diff * 1000000;
// printf("Time taken %f microsecond\n", msec);
unsigned long long* recv_data; //printf("test\n");
recv_data = (unsigned long long *)malloc(((num_of_node*process_per_host*num_of_processors)+num_of_processors)*sizeof(unsigned long long)); printMatrix(resultArray,num_of_node);
// unsigned long long* resultArray;
// resultArray = (unsigned long long *)malloc(((process_per_host*num_of_node)+1)*sizeof(unsigned long long));
unsigned long long **listResultArray;
listResultArray = (unsigned long long **)malloc(num_of_processors*sizeof(unsigned long long*));
for(int j=0;j<num_of_processors;j++){
listResultArray[j]=(unsigned long long*)malloc((num_of_node*process_per_host+1)*sizeof(unsigned long long));
}
double dijkstra_time = 0.0;
double start_time = 0.0;
// cudaFree(arr);
} // cudaFree(y);
\ No newline at end of file }
\ No newline at end of file
// int main2(int argc, char** argv){
// int num_of_node;
// if(argc != 2){
// printf("insert num of node\n");
// exit(1);
// }
// else{
// num_of_node = atoi(argv[1]);
// }
// //cudaMallocManaged(&x, N*sizeof(float));
// num_of_node = num_of_nodesss;
// unsigned long long **arr;
// unsigned long long *matrixToArrayResult;
// //matrixToArrayResult = (unsigned long long*) malloc ((num_of_node * num_of_node) * sizeof(unsigned long long));
// cudaMallocManaged(&matrixToArrayResult, (num_of_node * num_of_node) * sizeof(unsigned long long));
// //arr = (unsigned long long **)malloc(num_of_node*sizeof(unsigned long long*));
// cudaMallocManaged(&arr, num_of_node*sizeof(unsigned long long*));
// for(int j=0;j<num_of_node;j++){
// arr[j]=(unsigned long long*)malloc(num_of_node*sizeof(unsigned long long));
// }
// generateRandomArray(arr, num_of_node);
// unsigned long long **listTempArray;
// listTempArray = (unsigned long long **)malloc(num_of_node*sizeof(unsigned long long*));
// for(int j=0;j<num_of_node;j++){
// listTempArray[j]=(unsigned long long*)malloc(num_of_node*sizeof(unsigned long long));
// }
// int process_per_host;
// process_per_host = num_of_node / num_of_processors;
// unsigned long long* recv_data;
// recv_data = (unsigned long long *)malloc(((num_of_node*process_per_host*num_of_processors)+num_of_processors)*sizeof(unsigned long long));
// // unsigned long long* resultArray;
// // resultArray = (unsigned long long *)malloc(((process_per_host*num_of_node)+1)*sizeof(unsigned long long));
// unsigned long long **listResultArray;
// listResultArray = (unsigned long long **)malloc(num_of_processors*sizeof(unsigned long long*));
// for(int j=0;j<num_of_processors;j++){
// listResultArray[j]=(unsigned long long*)malloc((num_of_node*process_per_host+1)*sizeof(unsigned long long));
// }
// double dijkstra_time = 0.0;
// double start_time = 0.0;
// #pragma omp parallel num_threads(num_of_processors)
// {
// int world_rank = omp_get_thread_num();
// // printf("%d starting\n",world_rank);
// if(world_rank == 0){
// // printf("world_rank = 0\n");
// matrixToArray(arr, num_of_node, matrixToArrayResult);
// }
// #pragma omp barrier
// // DIJKSTRA
// // printf("Process %d array : \n", world_rank);
// unsigned long long* tempArray;
// tempArray = (unsigned long long *)malloc(num_of_node*sizeof(unsigned long long));
// #pragma omp barrier
// if(world_rank == 0){
// start_time = omp_get_wtime();
// }
// int count = 0;
// for (int source=process_per_host*world_rank ; source < (process_per_host*world_rank + process_per_host) ; source++){
// // printf("\nprocess, rank %d %d\n", process_per_host, world_rank);
// dijkstra(arr, source, num_of_node, listTempArray[source]);
// for(int y=0; y<num_of_node;y++){
// // resultArray[(count*num_of_node) + y] = listTempArray[source][y];
// listResultArray[world_rank][(count*num_of_node) + y] = listTempArray[source][y];
// }
// count++;
// }
// // resultArray[num_of_node * process_per_host] = world_rank;
// listResultArray[world_rank][num_of_node * process_per_host] = world_rank;
// #pragma omp barrier
// #pragma omp critical
// {
// // printf("%d critical\n",world_rank);
// for(int i=0;i<process_per_host * num_of_node + 1;i++){
// // recv_data[world_rank*(1+process_per_host*num_of_node) +i] = resultArray[i];
// recv_data[world_rank*(1+process_per_host*num_of_node) +i] = listResultArray[world_rank][i];
// }
// // Flag
// recv_data[world_rank*(1+process_per_host*num_of_node) +(process_per_host*num_of_node)] = world_rank;
// }
// #pragma omp barrier
// free(tempArray);
// if(world_rank == 0){
// // printf("\n");
// // for(int i=0;i<(num_of_node*process_per_host*num_of_processors)+num_of_processors;i++){
// // printf("%lld ",recv_data[i]);
// // if((i+1) % (num_of_node+1) == 0 && (i>0) ){
// // printf("\n");
// // }
// // }
// }
// // MPI_Gather(resultArray, process_per_host*num_of_node+1, MPI_UNSIGNED_LONG_LONG, recv_data, process_per_host*num_of_node+1, MPI_UNSIGNED_LONG_LONG, 0, MPI_COMM_WORLD);
// // #pragma omp barrier
// }
// unsigned long long *hasilAkhir;
// hasilAkhir = (unsigned long long *)malloc(num_of_node*num_of_node*sizeof(unsigned long long));
// int index;
// int count2;
// for(int i = 0; i < num_of_processors; i++){
// for(int j = (num_of_node*num_of_processors*process_per_host)+num_of_processors - 1; j >= 0; j-= (num_of_node*process_per_host)+1){
// // printf("j : %d\n",j);
// if(i == recv_data[j]){
// index = j;
// // printf("%d",index);
// break;
// }
// }
// count2 = 0;
// for(int j = index - (num_of_node*process_per_host); j < index; j++){
// hasilAkhir[recv_data[index]*(process_per_host*num_of_node)+count2] = recv_data[j];
// count2++;
// }
// }
// int sisa_source;
// sisa_source = num_of_node % (process_per_host * num_of_processors);
// printf("\nsisa : %d\n\n",sisa_source);
// if(num_of_node % num_of_processors != 0){
// unsigned long long* tempArray;
// tempArray = (unsigned long long *)malloc((num_of_node)*sizeof(unsigned long long));
// // printf("SISA Masok\n");
// int source;
// int count3 = 0;
// source = process_per_host * num_of_processors;
// // printf("Source Sisa = %d\n",sisa_source);
// for(int v=source ; v < source + sisa_source ; v++){
// dijkstra(arr, v, num_of_node, tempArray);
// for(int y=0; y<num_of_node;y++){
// // printf("Masukin sisa %d\n",(process_per_host*num_of_processors*num_of_node) + y + count3);
// hasilAkhir[(process_per_host*num_of_processors*num_of_node) + y + count3] = tempArray[y];
// // printf("Nilai %lld\n",hasilAkhir[(process_per_host*num_of_processors*num_of_node) + y + count3]);
// }
// count3+= num_of_node;
// }
// free(tempArray);
// }
// // printf("\n");
// // for(int i=0;i<num_of_node*num_of_node;i++){
// // printf("%lld ",hasilAkhir[i]);
// // if((i+1) % (num_of_node) == 0 && (i>0) ){
// // printf("\n");
// // }
// // }
// #pragma omp barrier
// dijkstra_time = omp_get_wtime() - start_time;
// // if(world_rank == 0){
// // printf("Time taken %f microsecond\n", dijkstra_time) * 1000000;
// printf("Time taken %f microsecond\n", dijkstra_time * 1000000);
// printArray(hasilAkhir,num_of_node);
// // printArrayTerminal(hasilAkhir, num_of_node);
// // if(world_rank == 0){
// for(int i=0;i<num_of_node;i++){
// free(arr[i]);
// }
// free(arr);
// free(recv_data);
// free(hasilAkhir);
// // }
// free(matrixToArrayResult);
// // }
// return 0;
// }
\ No newline at end of file
No preview for this file type
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