]> AND Private Git Repository - lniv_gpu.git/blobdiff - levelines_common.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
generation de chemins de taille parametrable
[lniv_gpu.git] / levelines_common.h
index ddb0ea2a01f25a19095bb56b10a1a0eb1f06383c..97d9bd74dd771572fc7533b2b3d3b54fce94dc17 100644 (file)
 #ifndef LEVELINES_COMMON_H
 #define LEVELINES_COMMON_H
 
 #ifndef LEVELINES_COMMON_H
 #define LEVELINES_COMMON_H
 
+#include <cuda_runtime.h>
 
 
 
 
-#include <cuda_runtime.h>
+/**
+ * \var Di_Q1
+ * \brief  table de coordonnees des segments pour le quadrant 1
+ *
+ */
+const int Di_Q1[6][3] = 
+  {{ -1, -1, -1},  /* 0 */
+   { -1, -1, -1},  /* 1 */
+   { -1, -1, -1},  /* 2 */
+   { -1, -1, -1},  /* 3 */
+   { -1,  0, -1},  /* 4 */
+   {  0, -1,  0}}; /* 5 */
+
 
 
+/**
+ * \var Dj_Q1
+ * \brief  table de coordonnees des segments pour le quadrant 1
+ *
+ */
+const int Dj_Q1[6][3] = 
+  {{  0,  0,  0},  /* 0 */
+   {  0,  1,  0},  /* 1 */
+   {  1,  0,  1},  /* 2 */
+   {  1,  1,  1},  /* 3 */
+   {  1,  1,  1},  /* 4 */
+   {  1,  1,  1}}; /* 5 */
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 // Reference CPU functions
 ////////////////////////////////////////////////////////////////////////////////
 
 
 
 ////////////////////////////////////////////////////////////////////////////////
 // Reference CPU functions
 ////////////////////////////////////////////////////////////////////////////////
-//extern "C" void fonc(...);
+extern "C" unsigned int lniv_cpu(unsigned int *image, int i, int j, int idim, int l, int *dout){
+
+  unsigned int value_c ;
+  unsigned int value2_c ;
+  unsigned int d, v, p, d_min, eq_min, eq, sum, sum2 ;
+  unsigned int sum_eq_min ;
+  unsigned int it, jt ;
+
+
+  /* mem */
+  value_c = image[ i*l + j ] ;
+  value2_c = value_c*value_c ;
+
+  // direction d=0
+  sum = value_c ;
+  sum2 = value2_c ;
+  it = i ;
+  jt = j ;
+  for (p=0; p<3; p++)
+    {
+      it += Di_Q1[0][p] ;
+      jt += Dj_Q1[0][p] ;
+      v = image[ it*l + jt ] ;
+      sum += v ;
+      sum2 += v*v ;
+    }
+  eq_min = sum2 - sum*sum/4 ; /* *4 */
+  sum_eq_min = sum ;
+  d_min = 0 ;
+
+  /* direction 1 a 5 */
+  for (d=1; d<6; d++)
+    {
+      sum = value_c ;
+      sum2 = value2_c ;
+      it = i ;
+      jt = j ;
+      for (p=0; p<3; p++)
+       {
+         it += Di_Q1[d][p] ;
+         jt += Dj_Q1[d][p] ;
+         v = image[it*l + jt] ;
+         sum += v ;
+         sum2 += v*v ;
+       }
+      eq = sum2 - sum*sum/4 ; /* *4 */
+      if (eq < eq_min)
+       {
+         eq_min = eq ;
+         sum_eq_min = sum ;
+         d_min = d ; /* pour info */    
+       }
+    }
+
+  /* direction 6 a 11 */
+  for (d=0; d<6; d++)
+    {
+      sum = value_c ;
+      sum2 = value2_c ;
+      it = i ;
+      jt = j ;
+      for (p=0; p<3; p++)
+       {
+         it += Dj_Q1[d][p] ;
+         jt -= Di_Q1[d][p] ;
+         v = image[it*l + jt] ;
+         sum += v ;
+         sum2 += v*v ;
+       }
+      eq = sum2 - sum*sum/4 ; /* *4 */
+      if (eq < eq_min)
+       {
+         eq_min = eq ;
+         sum_eq_min = sum ;
+         d_min = d+6 ; /* pour info */  
+       }
+    }
+
+  /* direction 12 a 17 */
+  for (d=0; d<6; d++)
+    {
+      sum = value_c ;
+      sum2 = value2_c ;
+      it = i ;
+      jt = j ;
+      for (p=0; p<3; p++)
+       {
+         it -= Di_Q1[d][p] ;
+         jt -= Dj_Q1[d][p] ;
+         v = image[it*l + jt] ;
+         sum += v ;
+         sum2 += v*v ;
+       }
+      eq = sum2 - sum*sum/4 ; /* *4 */
+      if (eq < eq_min)
+       {
+         eq_min = eq ;
+         sum_eq_min = sum ;
+         d_min = d+12 ; /* pour info */         
+       }
+    }
+  
+  /* direction 18 a 23 */
+  for (d=0; d<6; d++)
+    {
+      sum = value_c ;
+      sum2 = value2_c ;
+      it = i ;
+      jt = j ;
+      for (p=0; p<3; p++)
+       {
+         it -= Dj_Q1[d][p] ;
+         jt += Di_Q1[d][p] ;
+         v = image[it*l + jt] ;
+         sum += v ;
+         sum2 += v*v ;
+       }
+      eq = sum2 - sum*sum/4 ; /* *4 */
+      if (eq < eq_min)
+       {
+            eq_min = eq ;
+            sum_eq_min = sum ;
+            d_min = d+18 ; /* pour info */      
+       }
+    }
+  
+  *dout = d_min ;
+  return sum_eq_min/4 ;
+ };
+
 
 ////////////////////////////////////////////////////////////////////////////////
 // GPU functions (in file.cu)
 
 ////////////////////////////////////////////////////////////////////////////////
 // GPU functions (in file.cu)