From 48b1bac747f398161b53a67ad80c4596f531c88a Mon Sep 17 00:00:00 2001 From: Gilles Perrot Date: Fri, 11 Mar 2011 16:10:56 +0100 Subject: [PATCH] Fin de test multisnake sur iter 1 Pas performant --- exec/SNAKE2D | Bin 443971 -> 460768 bytes lib/lib_contour.o | Bin 5408 -> 5800 bytes lib/lib_gpu.o | Bin 148264 -> 164672 bytes lib/lib_snake_2_gpu.o | Bin 20272 -> 20272 bytes lib/lib_snake_common.o | Bin 10984 -> 10984 bytes lib/lib_test_gpu.o | Bin 22040 -> 22040 bytes lib/snake2D_gpu.o | Bin 259144 -> 259144 bytes src/lib_gpu.cu | 65 ++++++++++++++++++++++------------ src/lib_kernel_snake_2_gpu.cu | 61 +++++++++++++++++++++---------- src/structures.h | 8 +++++ 10 files changed, 93 insertions(+), 41 deletions(-) diff --git a/exec/SNAKE2D b/exec/SNAKE2D index 1d1de071a0d2a0dcc1c7f70a2ca453a92fabc7f3..40c66024076844a19714280bbc66d872d0a5a098 100755 GIT binary patch delta 48803 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%0DvW8R;Cke;J_)Lh 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 diff --git a/lib/lib_contour.o b/lib/lib_contour.o index 26fc29db2a5d6849f73dc93f103d4fc005baa0a5..e197c41044bf1f37622f1d7d48a040fb27508838 100644 GIT binary patch literal 5800 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 TgB@>4O{)NalO;f?>3@A*W_ndoY?u;~z z_9nyqde1rUdCv1Z@45VzaG$+IFpQ=RVc6malrQc7?1D+4Y&AG1W)hshX%hE6aL?@R5wOq=jO^Z z&E#{zh2(<9(uaJSW;AD5svIx*1F=gt_%Xj3%!b9WfWfzBt|xDm8_m}&KF?A!$RvHi z9!+L-`#>`5J2+<67HDX))}B|ogs+N0N4nw?ncgFA*_p8U*rr>zj62SLAJppVCRF2SP=U!?A(U{+Gt+3 zKjc}l+ky2#F|1P()=w0yCkfVGz*+!x%nkunFQ{MPZ(^Q0U(4fkmY_cOHFXg8D^REG zI1tsvh!2PY)jdFU0I2q?7RSr^TEaB$2bMTh@X<;huL73UJYEYd>wqe-+{ojNz;X+Z zH}RpZJnn!x1yKKHh}sZ9oe9i-u$;?{v2(v&t!d2@>}<^{Njy_Dt}{i$8kTww@A(|R z4$_&yTV`;<6hGE8H^e*o4pFf&`9&EKGkt*oG+B6@g_qi!KMxZv4YW*OVX0pO$K--; zN0SRa8;MPbqq+&a%;0S!d0CHul;~dbTfFTUF`Cq`&Qu( zr5_tSQNhC33~{Qg9pq%;k3eSw&|-80Jf+TCMb$=(9G+w0>mrJ`LzPIsRWu@P7M^0^ zdtyXK2AI^BXj+XN>SQuVB%Dtq{dO*wn++lxw&9mR#UuFdxPt$>%rz@^ z6OK7nC{>GzNu@e)JohyrQ&8=GF#>41mVpVd82~mtPsH&>VJtwj04DC|qoi4=Rf)D! zi8i4`+e@P5LsGM?Ud{dy(>8;10A@TeJHJQ_g0Hc2zH-!u>zSG6i|qXGO0_$IIFm1c z=C4rAxB=80zOJMV)jC44 zlwu!21#(1^Y#SDQn<0jml@dvF25+rk7HM_~TC8H$J#tGaS{(u$t!)*rQ=b_03bSB$ z13I)_Y3k6dpV~8PmRXko26FV9I)t8ZL@U!JAF{>?iu4K6Y`@ej)eSh~8aU%RmKt1u zGcNLR*BR$c@e@5WElw$Cy#0(bK51|Mhjhl%SQq$4>Q~Tla*>>I(Q(FZIOF3v7Of_Z*oizYe}A0aK=f1EQ9_DEZm^YGUzj9jFZTPr5<7mWXRn>c^8cFwhR}; zJ_jY3APax4oUw+5FPU;90`^L0tR@>&&WPM5VU339BAlzFH(QUkFntA_MlI@~TI6sV2)qeS?*peV>wLSzX;q07r-^?B zPE(mtB$0JUaoP=`J_u*m{5@6ZHH_aTnxLW_p)EPR*QYqG>QD#j(7y?7gLhILGNsog z0+OG^=_W`Cv%1Q{4?yXhqV%0sQ9)&lg=bNU0EL8F2h@2=OQ@-|0%}nD=LGd19uw3l zDnrG*ejhK|`9ok_4}^`($5_3v_+h{hO`B=vpgCr{-yi1F(mG5Q9cNJ@H%sk%uTtl%rdJ_ptHj`@r;vzOj zX+Db05@O5s=_21~dL#*4&le?urEQ2)xy*E)z_;@Rj*SB(*EZU*FzIQ43(M#r%TNUF z27%Y-`TMTlAuuHqbHK%VI^eqOl;B1IZp;C9g%AQa3UFfz+>emA&i|~9Ql$%!-^7q;Y`N!BXRp zwNM#{^yn@mTt_^bJ`M;To7et)<5_q=~p24u!YkHcH{k4&JgPdhmA5Lsls; zVw}|AxyM|c>j=LqX6D3jc+?r%of#<AdQ0(K!d-@hs-#P6 znm*d8=_f1ovWoJ+82Da`=k%lFrVK>I;84%uel65@ z^zh;SBM3Qi)b0p1wnJ^#AYAH_;r^(eM#kbhJ2ka&DeCG*$0Wj~i-_Py3?d z_oac(TYpiMrhNhPKGC?mK$KK6+v()Tj0J4ECKE>>eB#w)?w}4V>&B U>>lp_nbfozsLmOWaQ4pPKkaz>mH+?% diff --git a/lib/lib_gpu.o b/lib/lib_gpu.o index 1d978d71c79b038ef396127e2d289423a7156f74..dc40914efc7094023ffe440c5a153c150a20f8b5 100644 GIT binary patch delta 28299 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 delta 90 zcmdlmk8uMKxyY~>nVTk0_K?wM%{EObt=wEAbDj|_w%K2fokPGR*~r+yG}R!*(8Sol h#LR4Snpzh#%WgxS{>@)BFYrNhpRj0#YO#DM3IOl-97q5F diff --git a/lib/lib_snake_common.o b/lib/lib_snake_common.o index a7abed2ef461d8a955933849c850726a52adb319..4abaa10263948e0b65d0fafec97c96e3c0d0be65 100644 GIT binary patch delta 23 fcmaD6`XY1#i`e8V!dEum5HsOoG~djtc$*Udf%6G( delta 21 ccmaD6`XY1#ix{KjW>ztFZbrk+yo$Fu0a7pqRsaA1 diff --git a/lib/lib_test_gpu.o b/lib/lib_test_gpu.o index 5a6e207084fa2fad62942bcf51e75e492d46e1d1..676e14d94b4e7d6b37b6e874f1da597a93a36d7b 100644 GIT binary patch delta 99 zcmbQShH=Ik#tke=ET#sDW|KLTbhs@t1AT+NG`TqS^(Q+jS#GXSn!pH_-OQs>&%tk+ tWN4UbV47%{l4zNdYP@-tP8l;xSL_eb%_0Uf_#nn?uxo(mFtL9k1^{~D9Y_EG delta 99 zcmbQShH=Ik#tke=EJo(WMw2;|bht}QBOD7tG`TqS^(Q+jS#GXSn!pH_-OQs>&%tkG tWNu=dlxUf3VQH9Xn6!D8P8l;x`6X80%_0Uf_#nn?uxo(mFtL9k1^`k290>pb diff --git a/lib/snake2D_gpu.o b/lib/snake2D_gpu.o index 7be4b887b6719091caa4945ae7b133fa8bad7209..3b6bf11f1860977ebd5ecee462f954e1d3d5542c 100644 GIT binary patch delta 705 zcmX@{g8#$|{tYbuSxgO$j3;ya*JevIGA+&bojQ@xd2`MGZbq=gc5X(-%EwHWCfnPd zFuE`T8Ph-fWK^5}=_#WZh|~BB$Vqv|=nYb`@fl+W6I@B+OU4Yil8-MLGeI1n61nMn znVAHpcfDeK0arWgHIiDbH*mGG({ukavTxt{hH(lDO!4;8kBt6cmw+ta{^k>-G?<4l z+WZUS6S!*UugI!*eM6{*8vgq`<7b%1`a#-&#!djy2m>8|Grocvs6IX958SQl)1Ur9 zxOF?wt!2z`i@6z@keu1X#Dwb1Z*YaTS&$V5u^|*fT{xMY=>*LClH1F8nBrjGm)!oI zmq`oeeW~fD{7iqL=1Ok&6=2FlD7+}hWCB;XT~U}R8_Wa7rpWX~B1}mjZ9t!kOqUXc zaDd(y-9A~A=?f>5kDlj=Q85vJcRABM}if>=9zyt(F zM%y unT5Hrg@t*NrTKQ=UgpQlEPu^h*|vX~z|0{HPKwjkFxNxUWb+#4qwWAm8TLm2 delta 705 zcmX@{g8#$|{tYbuS&YmR(-G?<4l z+WZUS6S!*UugI!*eM6{*8vgq`<7b%1`a#-&#!djy2m>8|Grocvs6IX958SQl)1Ur9 zxOF?wt!2z`i@6z@keu1X#Dwb1Z*YaTS&$V5u^|*fT{xMY=>*LClH1F8nBrjGm)!oI zmq`oeeW~fD{7iqL=1Ok&6=2FlD7+}hWCB;XT~U}R8_Wa7rpWX~B1}mjZ9t!kOqUXc zaDd(y-9A~A=?f>5q4D%ic_wcrL$m4E=9zyt(_ z#@jb5G1ZuYL<}RCfZ=Lrx?L@bsT9Zns}OERUgpQlEE!A^dfUHDVCIkpC&g)NnCl^FvUv^jQFj3IGxu)* diff --git a/src/lib_gpu.cu b/src/lib_gpu.cu index 1bbd61d..5a90c1c 100644 --- a/src/lib_gpu.cu +++ b/src/lib_gpu.cu @@ -153,9 +153,9 @@ void cuda_init_img_cumul(unsigned short ** img_in, int H, int L, int nb_nodes, calcul_stats_image<<<1, 1>>>( *d_img_x, *d_img_x2, H, L, (uint64*)*d_stats_snake); - cudaThreadSynchronize() ; - toc(chrono, "\tTemps GPU"); - if(DEBUG_IMG_CUMUL) + cudaThreadSynchronize() ; + toc(chrono, "\tTemps GPU"); + if(DEBUG_IMG_CUMUL) { //allocation memoire CPU @@ -231,33 +231,52 @@ void cuda_init_img_cumul(unsigned short ** img_in, int H, int L, int nb_nodes, * generation snake en mem GPU */ int dist = 140 ; - - tic(&chrono, NULL); - int MAX_DIAGOS = 1024*65536 ; - int ret, Q = 120 ; - int * d_n_diagos, h_n_diagos; - uint4 * d_diagos_snake ; - uint4 * h_diagos_snake = new uint4[MAX_DIAGOS]; - - - cudaMalloc( (void**) &d_n_diagos, sizeof(int)) ; - cudaMalloc( (void**) &d_diagos_snake, MAX_DIAGOS*sizeof(uint4)) ; - - genere_diagos_rectangle<<<1,1>>>(d_diagos_snake, H,L,Q, d_n_diagos); + /* Test de determination du snake rectangle initial optimal*/ + int div = 100;//nb de divisions de l'image : cela définit le pas. La valeur max découle du nb max de threads possible ds une grille + int Nperm = div*div*bs;//nb total de rectangles a tester. La distribution est ainsi irrégulière, mais plus simple. + double best_crit ; + int ind_best_crit ; + + t_rectangle_snake * d_all_crit, d_best_crit;//tableaux pour les résultats des différents rectangles / le meilleur + t_rectangle_snake * h_all_crit = new t_rectangle_snake[Nperm];//correspondant CPU - cudaMemcpy( &h_n_diagos, d_n_diagos, sizeof(int), cudaMemcpyDeviceToHost) ; - ret = cudaMemcpy( h_diagos_snake, d_diagos_snake, MAX_DIAGOS*sizeof(uint4), cudaMemcpyDeviceToHost) ; + //allocations + cudaMalloc((void**) &d_all_crit, Nperm*sizeof(t_rectangle_snake)); + cudaMalloc((void**) &d_best_crit, sizeof(t_rectangle_snake)); + + tic(&chrono, NULL); - toc(chrono, "\tCalcul diagos"); + //execution kernel + dim3 grid = dim3(H/div, L/div, 1); + calcul_contribs_snake4<<>>(*d_snake, *d_img_x, *d_img_x2, H, L, *d_stats_snake, d_all_crit) ; + cudaThreadSynchronize(); + toc(chrono, "\nCALCULS RECTANGLES"); - printf("COPY : %s, DIAGOS = %d / %d\n", (ret==0)?"OK":"ERREUR", h_n_diagos,MAX_DIAGOS); - for (int d=0; d<200;d++){ - printf("| (%d,%d)-(%d,%d) ", h_diagos_snake[d].x, h_diagos_snake[d].y, h_diagos_snake[d].z, h_diagos_snake[d].w ); + //recup data rectangles + int ret; + ret = cudaMemcpy( h_all_crit, d_all_crit, Nperm*sizeof(t_rectangle_snake), cudaMemcpyDeviceToHost) ; + printf("COPIE DATA = %s\n",(ret==0)?"OK":"ERR"); + + //optimum sur CPU + best_crit = h_all_crit[0].crit ; + ind_best_crit = 0 ; + for (int k=1; k<100; k++){ + if ((h_all_crit[k].crit > 0) && (h_all_crit[k].crit < best_crit)) { + best_crit = h_all_crit[k].crit ; + ind_best_crit = k ; + } + printf("%d -> ( %d, %d )--( %d, %d) CRITERE = %f\n", k, h_all_crit[k].bpi, h_all_crit[k].bpj, + h_all_crit[k].opi, h_all_crit[k].opj, h_all_crit[k].crit ); } + printf("BEST RECTANGLE/%d tests : %d -> ( %d, %d )--( %d, %d) CRITERE = %f\n", Nperm, ind_best_crit, h_all_crit[ind_best_crit].bpi, h_all_crit[ind_best_crit].bpj, + h_all_crit[ind_best_crit].opi, h_all_crit[ind_best_crit].opj, best_crit ); + exit(0); - genere_snake_rectangle_4nodes_gpu<<< 1, 1>>>(*d_snake, 140, H, L) ; + /*fin test snake rectangle initial optimal*/ + + //genere_snake_rectangle_4nodes_gpu<<< 1, 1>>>(*d_snake, 140, H, L) ; int nnodes = nb_nodes ; diff --git a/src/lib_kernel_snake_2_gpu.cu b/src/lib_kernel_snake_2_gpu.cu index 5293308..3796e65 100644 --- a/src/lib_kernel_snake_2_gpu.cu +++ b/src/lib_kernel_snake_2_gpu.cu @@ -468,46 +468,52 @@ __global__ void calcul_stats_snake(snake_node_gpu * d_snake, int nnodes, int64 d_stats_snake[3], d_stats_snake[4], d_stats_snake[5]); } +// kernel d'init rectangulaire au niveau snake +// un block par point de base et un point opposé par thread du bloc -__global__ void calcul_contribs_snake4(t_cumul_x * cumul_x, t_cumul_x2 * cumul_x2, int h, int l, tcontribs * gcontribs, - uint64 SUM_1, uint64 SUM_X, uint64 SUM_X2) +__global__ void calcul_contribs_snake4(snake_node_gpu * snake, t_cumul_x * cumul_x, t_cumul_x2 * cumul_x2, int h, int l, + int64 * sums, t_rectangle_snake * critere) { // nb de diagonales testees par bloc (ie. par point de base NO) - int blockSize = blockDim.x ; + int blockSize = blockDim.x ; // indice du second point de chaque diagonale (=Opposite Point, = point SE) int OPib = threadIdx.x ; // coordonnees de chaque point de base (NO) int BPi = blockIdx.x ; int BPj = blockIdx.y ; //coordonnees de chaque Opposite Point (SE) - int OPi = OPib / (l - BPj) ; - int OPj = OPib - (l - BPj)*OPi ; + double incThread = ((h-BPi)*(l-BPj) + blockSize -1)/(double)blockSize ; + int OPi = (double)(OPib*incThread)/(l - BPj) ; + int OPj = OPib*incThread - OPi*(l-BPj) ; OPi += BPi ; OPj += BPj ; + if (OPi >= h) OPi = h-1 ; + if (OPj >= l) OPj = l-1 ; //indices des pixels dans les images cumulees int posG, posD; //contrib 1 du snake int C1 = (OPi - BPi)*(OPj - BPj) ; - - + //pour stocker contribs de chaque snake d'un block - //TODO on peut utiliser une structure restreinte (sans le c1) = gain d'espace + //TODO on peut utiliser une structure restreinte (sans le c1) extern __shared__ tcontribs scumuls[]; - + //calcul contribs du snake + scumuls[CFI(OPib)].cx = 0; + scumuls[CFI(OPib)].cx2 = 0; for (int k=BPi ; k < OPi ; k++) { posG = (BPi+k)*l + BPj ; posD = posG - BPj + OPj ; - scumuls[CFI(OPib)].cx += cumul_x[ posD ] - cumul_x[ posG ] ; - scumuls[CFI(OPib)].cx2 += cumul_x2[ posD ] - cumul_x2[ posG ]; + scumuls[CFI(OPib)].cx += (cumul_x[ posD ] - cumul_x[ posG ]) ; + scumuls[CFI(OPib)].cx2 += (cumul_x2[ posD ] - cumul_x2[ posG ]); } //calcul de critère pour chaque snake uint64 stat_sum_xe ; /* somme des xn region exterieure */ uint32 ne ; /* nombre de pixel region exterieure */ double sigi2, sige2; /* variance region interieure et exterieure */ - double criterion; + int index_crit; /* variance des valeurs des niveaux de gris a l'interieur du snake */ sigi2 = @@ -515,15 +521,34 @@ __global__ void calcul_contribs_snake4(t_cumul_x * cumul_x, t_cumul_x2 * cumul_x ((double)scumuls[CFI(OPib)].cx/(uint64)C1)*((double)scumuls[CFI(OPib)].cx/(uint64)C1) ; /* variance des valeurs des niveaux de gris a l'exterieur du snake */ - ne = SUM_1 - C1 ; - stat_sum_xe = SUM_X - scumuls[CFI(OPib)].cx ; + + ne = sums[3] - C1 ; + stat_sum_xe = sums[4] - scumuls[CFI(OPib)].cx ; sige2 = - ((double)SUM_X2-scumuls[CFI(OPib)].cx2)/(double)ne - + ((double)sums[5]-scumuls[CFI(OPib)].cx2)/(double)ne - ((double)stat_sum_xe/(uint64)ne)*((double)stat_sum_xe/(uint64)ne) ; - if ((sigi2 > 0)|(sige2 > 0)) - criterion = 0.5*((double)C1*log(sigi2) + (double)ne*log(sige2)) ; + index_crit = blockSize*(BPi*gridDim.y + BPj) + OPib ; + - //tri meilleur snake du bloc ( necessite de passer SUM_1, SUM_X et SUM_X2 ) + if ((sigi2 > 0)|(sige2 > 0)) + { + critere[ index_crit ].bpi = BPi; + critere[ index_crit ].bpj = BPj; + critere[ index_crit ].opi = OPi; + critere[ index_crit ].opj = OPj; + critere[ index_crit ].crit = 0.5*((double)C1*log(sigi2) + (double)ne*log(sige2)) ; + } + else + { + critere[ index_crit ].bpi = BPi; + critere[ index_crit ].bpj = BPj; + critere[ index_crit ].opi = OPi; + critere[ index_crit ].opj = OPj; + critere[ index_crit ].crit = -1 ; + } + // identification meilleur snake du bloc + // laissé au CPU pour test mais le principe de ce kernel n'est pas efficace. + } diff --git a/src/structures.h b/src/structures.h index b2a9554..3977661 100644 --- a/src/structures.h +++ b/src/structures.h @@ -141,5 +141,13 @@ struct snake_node_gpu int last_move ; /* dernier test deplacement accepte */ }; +/* pour mémoriser les coordonnées des diagonales des rectangles en multisnake*/ + struct t_rectangle_snake { + int bpi; + int bpj; + int opi; + int opj; + double crit; + }; #endif -- 2.39.5