From b7eacd50f5a040278858a63fd90f20e7a4a6fe42 Mon Sep 17 00:00:00 2001
From: Hilmi Naufal Yafie <13517035@std.stei.itb.ac.id>
Date: Sun, 5 Apr 2020 19:16:19 +0800
Subject: [PATCH] optimalize code

---
 src/dijkstra_cuda.cuh | 24 +++++++++++++++++++++---
 src/paralel.cu        | 26 ++++++++++++++------------
 2 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/src/dijkstra_cuda.cuh b/src/dijkstra_cuda.cuh
index 9a4a53c..7948e2a 100644
--- a/src/dijkstra_cuda.cuh
+++ b/src/dijkstra_cuda.cuh
@@ -50,9 +50,10 @@ void initValue(long *graph, long *allResult, int *visitedNode, int *minIndex, in
 	*minIndex = -1;
 	visitedNode[sourceIdx] = 1;
 }
-
+/*
 __global__ 
 void findMinDistance(long *allResult, int *visitedNode, int *minIndex, long *minDistance, int num_vertices) {
+	
 	*minDistance = LONG_MAX;
 
 	for (int j=0; j<num_vertices; j++) {
@@ -63,10 +64,25 @@ void findMinDistance(long *allResult, int *visitedNode, int *minIndex, long *min
 	}
 
 	visitedNode[*minIndex] = 1;
+	
 }
-
+*/
 __global__
-void setNewDistance(long *graph, long *allResult, int *visitedNode, int *minIndex, long *minDistance, int num_vertices) {
+void findAndSetNewDistance(long *graph, long *allResult, int *visitedNode, int *minIndex, long *minDistance, int num_vertices) {
+	
+	*minDistance = LONG_MAX;
+
+	for (int j=0; j<num_vertices; j++) {
+		if (visitedNode[j]==0 && allResult[j]<*minDistance) {
+			*minDistance = allResult[j];
+			*minIndex = j;
+		}
+	}
+	
+	__syncthreads();
+	
+	visitedNode[*minIndex] = 1;
+	
 	int index = threadIdx.x + blockDim.x * blockIdx.x;
 	int stride = blockDim.x * gridDim.x;
 
@@ -79,6 +95,8 @@ void setNewDistance(long *graph, long *allResult, int *visitedNode, int *minInde
 		}
 	}
 }
+
+
 /**
  * generate a graph with n vertices
  * @param  n number of vertices
diff --git a/src/paralel.cu b/src/paralel.cu
index f9d82c8..91e3515 100644
--- a/src/paralel.cu
+++ b/src/paralel.cu
@@ -68,9 +68,6 @@ int main (int argc, char const *argv[]) {
     // dijkstra algorithm for each vertice
     for (int i=0; i<num_vertices; i++) {
         
-        // set timer
-        start_time = get_micros();
-        
         // initialize value for dijkstra in device
         initValue<<<numBlocks, blockSize>>>(
             gpu_graph,
@@ -79,20 +76,25 @@ int main (int argc, char const *argv[]) {
             minIndex,
             i,
             num_vertices);
-
+            
+        // set timer
+        start_time = get_micros();
         // for each vertice except current vertice (source)
+        
         for (int j=1; j<num_vertices; j++) {
             
             // find minimal distance
-            findMinDistance<<<1,1>>>(
-                gpu_result,
-                gpu_visitedNode,
-                minIndex,
-                minDistance,
-                num_vertices);
-            
+            //findMinDistance<<<numBlocks,blockSize,num_vertices*sizeof(int)+num_vertices*sizeof(long)>>>(
+            //
+            //findMinDistance<<<1,1>>>(
+            //    gpu_result,
+            //    gpu_visitedNode,
+            //    minIndex,
+            //    minDistance,
+            //    num_vertices);
+            //
             // update distance for each vertice if new distance < old distance
-            setNewDistance<<<numBlocks, blockSize>>>(
+            findAndSetNewDistance<<<numBlocks, blockSize>>>(
                 gpu_graph,
                 gpu_result,
                 gpu_visitedNode,
-- 
GitLab