]> AND Private Git Repository - snake_gpu.git/blob - src/lib_snake_2_gpu.cu
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Initial commit
[snake_gpu.git] / src / lib_snake_2_gpu.cu
1
2 extern "C"{
3 #include "structures.h"
4 #include "lib_snake_2_gpu.h"
5 }
6 #include "stdio.h"
7
8 void snake2gpu( snake_node_gpu * d_snake, snake_node* h_snake, int n ){
9
10   snake_node * snake = h_snake;
11   snake_node_gpu snake_nodes[n];
12
13   for (int i=0; i<n; i++){
14         
15         snake_nodes[i].sum_1 = snake->contrib.sum_1 ;
16         snake_nodes[i].sum_x = snake->contrib.sum_x ;
17         snake_nodes[i].sum_x2 = snake->contrib.sum_x2 ;
18         
19         snake_nodes[i].code_segment = snake->code_segment ;
20         snake_nodes[i].freeman_in = snake->freeman_in ;
21         snake_nodes[i].freeman_out = snake->freeman_out ;
22         snake_nodes[i].nb_pixels = snake->nb_pixels ;
23
24         snake_nodes[i].posi = snake->posi ;
25         snake_nodes[i].posj = snake->posj ;
26         snake_nodes[i].centre_i = snake->centre_i ;
27         snake_nodes[i].centre_j = snake->centre_j ;
28
29         snake_nodes[i].last_move = snake->last_move ;
30         
31         snake = snake->noeud_suiv ;
32   }
33   
34   cudaMemcpy( d_snake, snake_nodes, n*sizeof(snake_node_gpu), cudaMemcpyHostToDevice );
35
36   /*verif integrite data*/
37   /*
38   snake_node_gpu new_snake_nodes[n];
39   cudaMemcpy( new_snake_nodes , d_snake, n*sizeof(snake_node_gpu), cudaMemcpyDeviceToHost );
40
41   for (int i=0; i<n; i++){
42         printf("NODE %d : ", i);
43         printf("\tsum_1 : %u - sum_x : %lu - sum_x2 : %lu\n", new_snake_nodes[i].sum_1,  new_snake_nodes[i].sum_x ,  new_snake_nodes[i].sum_x2) ;
44         
45         printf("\tcode_segment : %d\n", new_snake_nodes[i].code_segment ) ;
46         printf("\tfreeman_in : %d\n", new_snake_nodes[i].freeman_in );
47         printf("\tfreeman_out : %d\n", new_snake_nodes[i].freeman_out ) ;
48         printf("\tnb_pixels : %d\n", new_snake_nodes[i].nb_pixels ) ;
49
50         printf("\ti = %d\n", new_snake_nodes[i].posi ) ;
51         printf("\tj = %d\n", new_snake_nodes[i].posj ) ;
52         printf("\tcentre i = %d\n", new_snake_nodes[i].centre_i ) ;
53         printf("\tcentre j = %d\n", new_snake_nodes[i].centre_j ) ;
54
55         printf("\tlast_move : %d\n", new_snake_nodes[i].last_move ) ;
56
57         }
58   */
59 }
60
61
62 void gpu2snake( snake_node_gpu * d_snake, snake_node **h_snake, int n ){
63   
64   snake_node *snake_prec, *snake ;
65   snake_node_gpu * snake_nodes = new snake_node_gpu[n];
66   cudaMemcpy( snake_nodes, d_snake, n*sizeof(snake_node_gpu), cudaMemcpyDeviceToHost );
67
68   *h_snake = new snake_node;
69   
70   for (int i=0; i<n; i++){
71         if (i == 0 ) snake = *h_snake;
72         else {
73           snake_prec = snake;
74           snake = new snake_node;
75           snake_prec->noeud_suiv = snake;
76           snake->noeud_prec = snake_prec;
77         }
78         if (i == n-1) {
79           snake->noeud_suiv = *h_snake;
80           (*h_snake)->noeud_prec = snake;
81         }
82         /*
83         snake->contrib.sum_1 = snake_nodes[i].sum_1 ;
84         snake->contrib.sum_x = snake_nodes[i].sum_x ;
85         snake->contrib.sum_x2 = snake_nodes[i].sum_x2 ;
86         
87         snake->code_segment = snake_nodes[i].code_segment ;
88         snake->freeman_in = snake_nodes[i].freeman_in ;
89         snake->freeman_out = snake_nodes[i].freeman_out ;
90         */
91         snake->nb_pixels = snake_nodes[i].nb_pixels ;
92         snake->posi = snake_nodes[i].posi ;
93         snake->posj = snake_nodes[i].posj ;
94         /*
95         snake->centre_i = snake_nodes[i].centre_i ;
96         snake->centre_j = snake_nodes[i].centre_j ;
97         snake->last_move = snake_nodes[i].last_move ;
98         */
99   }
100   
101   /*verif integrite donnees*/
102   
103   snake = *h_snake ;
104   for (int i=0; i<n; i++){
105         printf("NODE %d : ", i);
106         /*
107         printf("\tcode_segment : %d\n", snake->code_segment ) ;
108         printf("\tfreeman_in : %d\n", snake->freeman_in );
109         printf("\tfreeman_out : %d\n", snake->freeman_out ) ;
110         */
111         printf("\tnb_pixels : %d", snake->nb_pixels ) ;
112
113         printf("\ti = %d ", snake->posi ) ;
114         printf("\tj = %d \n", snake->posj ) ;
115         /*
116         printf("\tcentre i = %d\n", snake->centre_i ) ;
117         printf("\tcentre j = %d\n", snake->centre_j ) ;
118
119         printf("\tcontribs = %lu - %lu - %lu\n", snake->contrib.sum_1, snake->contrib.sum_x, snake->contrib.sum_x2 ) ;
120
121         printf("\tlast_move : %d\n", snake->last_move ) ;
122         */
123         snake = snake->noeud_suiv;
124         }
125   delete snake_nodes;
126 }
127
128 void dessine_snake(snake_node_gpu * snake, int nnodes, unsigned short ** img, int r){
129      int couleur = 255;
130      int i,j;
131      for (int node=0;node < nnodes; node++){
132          i = snake[node].posi ;
133          j = snake[node].posj ;
134          for (int xi=0; xi<=r; xi++){
135                  img[i-xi][j] = couleur ;
136                  img[i+xi][j] = couleur ; 
137                  img[i][j-xi] = couleur ;
138                  img[i][j+xi] = couleur ; 
139                  }
140      }
141 }