10 #include <cuda_runtime.h>
11 #include <cutil_inline.h>
15 #include "levelines_common.h"
17 #include "levelines_kernels.cu"
19 const float tang[] = {0, 0.268, 0.577, 1} ;
22 void genPaths(unsigned int *h_paths, int *p_i, int *p_j, unsigned int r ){
23 unsigned int idpath = 0 ;
28 for (int a=0 ; a< 4 ; a++){ // les 4 angles 0,15,30 et 45
29 for (int p=0 ; p< r ; p++){ // les r points
31 ic = r-1 - floor(tang[a]*p + offset) ;
32 h_paths[ idpath*r*r + ic*r + jc ] = 255 ;
34 p_i[idpath*(r-1)+p-1] = ic ;
35 p_j[idpath*(r-1)+p-1] = jc ;
41 for (int a=2 ; a>0 ; a--){ // les 2 angles 60 et 75
42 for (int p=0 ; p< r ; p++){ // les r points
44 jc = floor(tang[a]*p + offset) ;
45 h_paths[ idpath*r*r + ic*r + jc ] = 255 ;
47 p_i[idpath*(r-1)+p-1] = ic ;
48 p_j[idpath*(r-1)+p-1] = jc ;
55 for (int a=0 ; a< 4 ; a++){ // les 4 angles 90,105,130 et 145
56 for (int p=0 ; p< r ; p++){ // les r points
58 jc = r-1 - floor(tang[a]*p + offset) ;
59 h_paths[ idpath*r*r + ic*r + jc ] = 255 ;
61 p_i[idpath*(r-1)+p-1] = ic ;
62 p_j[idpath*(r-1)+p-1] = jc ;
68 for (int a=2 ; a>0 ; a--){ // les 2 angles 60 et 75
69 for (int p=0 ; p< r ; p++){ // les r points
71 ic = r-1 - floor(tang[a]*p + offset) ;
72 h_paths[ idpath*r*r + ic*r + jc ] = 255 ;
74 p_i[idpath*(r-1)+p-1] = ic ;
75 p_j[idpath*(r-1)+p-1] = jc ;
83 for (int a=0 ; a< 4 ; a++){ // les 4 angles 90,105,130 et 145
84 for (int p=0 ; p< r ; p++){ // les r points
86 ic = floor(tang[a]*p + offset) ;
87 h_paths[ idpath*r*r + ic*r + jc ] = 255 ;
89 p_i[idpath*(r-1)+p-1] = ic ;
90 p_j[idpath*(r-1)+p-1] = jc ;
96 for (int a=2 ; a>0 ; a--){ // les 2 angles 60 et 75
97 for (int p=0 ; p< r ; p++){ // les r points
99 jc = r-1 - floor(tang[a]*p + offset) ;
100 h_paths[ idpath*r*r + ic*r + jc ] = 255 ;
102 p_i[idpath*(r-1)+p-1] = ic ;
103 p_j[idpath*(r-1)+p-1] = jc ;
111 for (int a=0 ; a< 4 ; a++){ // les 4 angles 90,105,130 et 145
112 for (int p=0 ; p< r ; p++){ // les r points
114 jc = floor(tang[a]*p + offset) ;
115 h_paths[ idpath*r*r + ic*r + jc ] = 255 ;
117 p_i[idpath*(r-1)+p-1] = ic ;
118 p_j[idpath*(r-1)+p-1] = jc ;
124 for (int a=2 ; a>0 ; a--){ // les 2 angles 60 et 75
125 for (int p=0 ; p< r ; p++){ // les r points
127 ic = floor(tang[a]*p + offset) ;
128 h_paths[ idpath*r*r + ic*r + jc ] = 255 ;
130 p_i[idpath*(r-1)+p-1] = ic ;
131 p_j[idpath*(r-1)+p-1] = jc ;
140 int main(int argc, char **argv){
142 // use device with highest Gflops/s
143 cudaSetDevice( cutGetMaxGflopsDeviceId() );
145 cutilCheckError( cutCreateTimer(&timer) );
146 cutilCheckError( cutResetTimer(timer) );
147 cutilCheckError( cutStartTimer(timer) );
148 // une alloc debile pour initialiser la carte GPU
150 cutilSafeCall( cudaMalloc( (void**) &d_void, 4)) ;
154 /*********************************
155 * DEFINITION PARAMS CHEMINS
156 *********************************/
157 char* image_out = "./image_out.pgm" ;
160 unsigned int * h_paths ;
161 unsigned int R = atoi(argv[1]);
164 //unsigned int size = R * R * sizeof( unsigned int );
168 int memsize = 24*(R-1)*sizeof(int2) ;
169 cutilSafeCall( cudaMalloc( (void**) &d_paths, memsize ) );
172 h_paths = new unsigned int [24*R*R] ;
173 p_i = new int [24*(R-1)] ;
174 p_j = new int [24*(R-1)] ;
176 for (int j=0; j<24*R*R ; j++) h_paths[j] = 0 ;
178 genPaths(h_paths, p_i, p_j, R) ;
180 printf("Rayon : %d pixels \n", R) ;
184 for (int idpath=0; idpath < 24; idpath++){
186 for (int idpix=0; idpix < R-1; idpix++){
187 printf(" %d ", p_i[idpath*(R-1)+idpix]);
192 for (int idpath=0; idpath < 24; idpath++){
194 for (int idpix=0; idpix < R-1; idpix++){
195 printf(" %d ", p_j[idpath*(R-1)+idpix]);
200 /*****************************
201 * APPELS KERNELS et chronos
202 *****************************/
204 dim3 dimBlock( 1, 1, 1 ) ;
205 dim3 dimGrid( 1, 1, 1 ) ;
207 kernel_calcul_paths<<< dimGrid, dimBlock, 0 >>>(d_paths, R) ;
209 printf("\nGrille : %d x %d de Blocs : %d x %d \n", dimGrid.x, dimGrid.y, dimBlock.x, dimBlock.y) ;
212 /**************************
214 **************************/
216 int2 * paths = new int2[24*(R-1)] ;
217 cutilSafeCall( cudaMemcpy(paths , d_paths, memsize, cudaMemcpyDeviceToHost) );
221 for (int idpath=0; idpath < 24; idpath++){
223 for (int idpix=0; idpix < R-1; idpix++){
224 printf(" %d ", paths[idpath*(R-1)+idpix].x);
226 printf("\t // %d", 15*idpath);
230 for (int idpath=0; idpath < 24; idpath++){
232 for (int idpix=0; idpix < R-1; idpix++){
233 printf(" %d ", paths[idpath*(R-1)+idpix].y);
235 printf("\t // %d", 15*idpath);
240 // enregistrement image des PATHS
241 //cutilSafeCall( cudaMemcpy(h_paths , d_paths, size, cudaMemcpyDeviceToHost) );
243 cutilCheckError( cutSavePGMi(image_out, h_paths, R, 24*R) ) ;
245 // TODO verifier pourquoi les deux lignes suivantes produisent une erreur
246 //cutilExit(argc, argv);
248 return EXIT_SUCCESS ;