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