X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/33eeb4be26b53ed1561488ce78e392b40ecf74df..795d4f3883317c84038a2ba73670967dcad9a48a:/examples/gras/pmm/pmm.c diff --git a/examples/gras/pmm/pmm.c b/examples/gras/pmm/pmm.c index 8dc7235fb6..efbb6b0604 100755 --- a/examples/gras/pmm/pmm.c +++ b/examples/gras/pmm/pmm.c @@ -10,10 +10,10 @@ #include "gras.h" #include "xbt/matrix.h" -#define PROC_MATRIX_SIZE 2 +#define PROC_MATRIX_SIZE 3 #define SLAVE_COUNT (PROC_MATRIX_SIZE*PROC_MATRIX_SIZE) -#define DATA_MATRIX_SIZE 4 +#define DATA_MATRIX_SIZE 600 const int submatrix_size = DATA_MATRIX_SIZE/PROC_MATRIX_SIZE; XBT_LOG_NEW_DEFAULT_CATEGORY(pmm,"Parallel Matrix Multiplication"); @@ -52,18 +52,9 @@ static void register_messages(void) { /* send from master to slave to assign a position and some data */ gras_msgtype_declare("assignment", assignment_type); - /* send from master to slave to ask a final result */ - gras_msgtype_declare("ask_result", gras_datadesc_by_name("int")); - - /* send from master to slave to indicate the begining of step */ - gras_msgtype_declare("step", gras_datadesc_by_name("int")); - /* send from slave to master to indicate the end of the current step */ - gras_msgtype_declare("step_ack", gras_datadesc_by_name("int")); - - /* send data between slave */ - gras_msgtype_declare("dataA", gras_datadesc_by_name("double")); - /* send data between slave */ - gras_msgtype_declare("dataB", gras_datadesc_by_name("double")); + /* send data between slaves */ + gras_msgtype_declare("dataA", gras_datadesc_matrix(gras_datadesc_by_name("double"),NULL)); + gras_msgtype_declare("dataB", gras_datadesc_matrix(gras_datadesc_by_name("double"),NULL)); } /* Function prototypes */ @@ -109,40 +100,34 @@ static void gather(){ int master (int argc,char *argv[]) { - xbt_ex_t e; - - int i,port,ask_result,step; + int i,port; xbt_matrix_t A,B,C; result_t result; gras_socket_t from; - /* Init the GRAS's infrastructure */ - gras_init(&argc, argv); xbt_host_t grid[SLAVE_COUNT]; /* The slaves */ gras_socket_t socket[SLAVE_COUNT]; /* sockets for brodcast to slaves */ + /* Init the GRAS's infrastructure */ + gras_init(&argc, argv); + register_messages(); + /* Initialize Matrices */ - A = xbt_matrix_double_new_id(DATA_MATRIX_SIZE,DATA_MATRIX_SIZE); B = xbt_matrix_double_new_seq(DATA_MATRIX_SIZE,DATA_MATRIX_SIZE); C = xbt_matrix_double_new_zeros(DATA_MATRIX_SIZE,DATA_MATRIX_SIZE); - //xbt_matrix_dump(B,"B:seq",0,xbt_matrix_dump_display_double); - - /* Get arguments and create sockets */ port=atoi(argv[1]); //scatter(); //scatter_parl(); //multiplication(); //gather(); - //display(A); /************************* Init Data Send *********************************/ - int step_ack; - gras_os_sleep(5); + gras_os_sleep(2); for( i=1;iname,grid[i-1]->port); } + xbt_assert2(i-1==SLAVE_COUNT, + "Not enough slaves for this setting (got %d of %d). Change the deployment file", + i-1,SLAVE_COUNT); /* FIXME: let the surnumerous slave die properly */ - + int row=0, line=0; + INFO0("XXXXXXXXXXXXXXXXXXXXXX begin Multiplication"); for(i=0 ; i= PROC_MATRIX_SIZE) { row=0; @@ -182,59 +170,38 @@ int master (int argc,char *argv[]) { } gras_msg_send(socket[i],gras_msgtype_by_name("assignment"),&assignment); - // INFO3("Send assignment to %s : data A= %.3g & data B= %.3g", - // gras_socket_peer_name(socket[i]),mydata.a,mydata.b); - + xbt_matrix_free(assignment.A); + xbt_matrix_free(assignment.B); } // end assignment /******************************* multiplication ********************************/ - INFO0("XXXXXXXXXXXXXXXXXXXXXX begin Multiplication"); - - for (step=0; step < PROC_MATRIX_SIZE; step++){ - for (i=0; i< SLAVE_COUNT; i++){ - TRY { - gras_msg_send(socket[i], gras_msgtype_by_name("step"), &step); - } CATCH(e) { - gras_socket_close(socket[i]); - RETHROW0("Unable to send the msg : %s"); - } - } - INFO1("XXXXXX Next step (%d)",step); - - /* wait for computing and slave messages exchange */ - - i=0; - while ( i< SLAVE_COUNT) { - TRY { - gras_msg_wait(1300,gras_msgtype_by_name("step_ack"),&from,&step_ack); - } CATCH(e) { - RETHROW0("Can't get a Ack step message from slave : %s"); - } - i++; - DEBUG3("Got step ack from %s (got %d of %d)", - gras_socket_peer_name(from), i, SLAVE_COUNT); - } - } - /********************************* gather ***************************************/ - - ask_result=0; - for( i=1;i< argc;i++){ - gras_msg_send(socket[i],gras_msgtype_by_name("ask_result"),&ask_result); - INFO1("Send (Ask Result) message to %s",gras_socket_peer_name(socket[i])); - } /* wait for results */ - for( i=1;i< argc;i++){ - gras_msg_wait(600,gras_msgtype_by_name("result"),&from,&result); - xbt_matrix_copy_values(result.C,C, submatrix_size,submatrix_size, + for( i=0;i< SLAVE_COUNT;i++){ + gras_msg_wait(6000,gras_msgtype_by_name("result"),&from,&result); + xbt_matrix_copy_values(C,result.C, submatrix_size,submatrix_size, submatrix_size*result.linepos, submatrix_size*result.rowpos, 0,0,NULL); + xbt_matrix_free(result.C); } /* end of gather */ - INFO0 ("The Result of Multiplication is :"); - xbt_matrix_dump(C,"C:res",0,xbt_matrix_dump_display_double); + if (DATA_MATRIX_SIZE < 50) { + INFO0 ("The Result of Multiplication is :"); + xbt_matrix_dump(C,"C:res",0,xbt_matrix_dump_display_double); + } else { + INFO1("Matrix size too big (%d>50) to be displayed here",DATA_MATRIX_SIZE); + } + for(i=0; i Myline(%d)",step,myline); TRY { - INFO1("mydataB=%p",mydataB); xbt_matrix_free(bB); - INFO1("mydataB=%p",mydataB); gras_msg_wait(600,gras_msgtype_by_name("dataB"),&from,&bB); - INFO1("mydataB=%p",mydataB); } CATCH(e) { RETHROW0("Can't get a data message from line : %s"); } - INFO1("Receive data B from my neighbor: %s", + INFO3("LINE: step(%d) <> Myline(%d). Receive data from %s",step,myline, gras_socket_peer_name(from)); } /* a row brodcast */ - if (myrow==step) { - for (l=1;l < PROC_MATRIX_SIZE ;l++){ - gras_msg_send(socket_line[l-1],gras_msgtype_by_name("dataA"), &mydataA); - xbt_matrix_free(bA); - bA = xbt_matrix_new_sub(mydataA, - submatrix_size,submatrix_size, - 0,0,NULL); - - INFO0("send my data A to my (horizontal) neighbors"); - } + if (myrow==step) { + INFO2("ROW: step(%d)=myrow(%d). Broadcast my data",step,myrow); + for (l=1;l < PROC_MATRIX_SIZE ;l++) + gras_msg_send(socket_line[l-1],gras_msgtype_by_name("dataA"), &mydataA); + xbt_matrix_free(bA); + bA = xbt_matrix_new_sub(mydataA, + submatrix_size,submatrix_size, + 0,0,NULL); } else { TRY { xbt_matrix_free(bA); @@ -381,42 +319,45 @@ int slave(int argc,char *argv[]) { } CATCH(e) { RETHROW0("Can't get a data message from row : %s"); } - INFO1("Receive data A from my neighbor : %s ", + INFO3("ROW: step(%d)<>myrow(%d). Receive data from %s",step,myrow, gras_socket_peer_name(from)); } xbt_matrix_double_addmult(bA,bB,bC); - /* send a ack msg to master */ - - gras_msg_send(master,gras_msgtype_by_name("step_ack"),&step); - - INFO1("Send ack to master for to end %d th step",step); - - } while (step < PROC_MATRIX_SIZE); - /* wait Message from master to send the result */ + }; + /* send Result to master */ result.C=bC; result.linepos=myline; result.rowpos=myrow; - - TRY { - gras_msg_wait(600,gras_msgtype_by_name("ask_result"), - &master,&result_ack); - } CATCH(e) { - RETHROW0("Can't get a data message from line : %s"); - } - /* send Result to master */ + TRY { gras_msg_send(master, gras_msgtype_by_name("result"),&result); } CATCH(e) { - // gras_socket_close(from); RETHROW0("Failed to send PING to server: %s"); } INFO2(">>>>>>>> Result sent to %s:%d <<<<<<<<", gras_socket_peer_name(master),gras_socket_peer_port(master)); /* Free the allocated resources, and shut GRAS down */ + + xbt_matrix_free(bA); + xbt_matrix_free(bB); + xbt_matrix_free(bC); + + xbt_matrix_free(mydataA); + xbt_matrix_free(mydataB); + gras_socket_close(sock); gras_socket_close(master); gras_socket_close(from); + /* FIXME: Some of these sockets are "not known", no idea why * + for (l=0; l < PROC_MATRIX_SIZE-1; l++) { + if (socket_line[l]) + gras_socket_close(socket_line[l]); + if (socket_row[l]) + gras_socket_close(socket_row[l]); + }*/ + + gras_exit(); INFO0("Done."); return 0;