X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7e081f749e69ecc10ea0274b33ab3b8a5b4d6a0b..f2d6ca40194a4c2823be67e3d270d19aa5ea6520:/examples/gras/pmm/pmm.c diff --git a/examples/gras/pmm/pmm.c b/examples/gras/pmm/pmm.c index c0320c4d33..86c563a3bb 100755 --- a/examples/gras/pmm/pmm.c +++ b/examples/gras/pmm/pmm.c @@ -1,4 +1,5 @@ -/* pmm - paralel matrix multiplication "double diffusion" */ +/* $Id$ */ +/* pmm - parallel matrix multiplication "double diffusion" */ /* Copyright (c) 2006- Ahmed Harbaoui. All rights reserved. */ @@ -6,30 +7,32 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "gras.h" -#define MATRIX_SIZE 3 -#define SLAVE_COUNT 9 +#define PROC_MATRIX_SIZE 3 +#define SLAVE_COUNT (PROC_MATRIX_SIZE*PROC_MATRIX_SIZE) + +#define DATA_MATRIX_SIZE 3 XBT_LOG_NEW_DEFAULT_CATEGORY(pmm,"Parallel Matrix Multiplication"); GRAS_DEFINE_TYPE(s_matrix,struct s_matrix { + int lines; int rows; - int cols; - double *data GRAS_ANNOTE(size, rows*cols); + double *data GRAS_ANNOTE(size, lines*rows); };) - typedef struct s_matrix matrix_t; - - /* struct for recovering results */ - GRAS_DEFINE_TYPE(s_result,struct s_result { - int i; - int j; - double value; - }); +typedef struct s_matrix matrix_t; + +/* struct for recovering results */ +GRAS_DEFINE_TYPE(s_result,struct s_result { + int i; + int j; + double value; +}); typedef struct s_result result_t; /* struct to send initial data to slave */ GRAS_DEFINE_TYPE(s_init_data,struct s_init_data { + int myline; int myrow; - int mycol; double a; double b; }); @@ -42,7 +45,7 @@ static void register_messages(void) { result_type=gras_datadesc_by_symbol(s_result); init_data_type=gras_datadesc_by_symbol(s_init_data); - gras_msgtype_declare("result", result_type); // recieve a final result from slave + gras_msgtype_declare("result", result_type); // receive a final result from slave gras_msgtype_declare("init_data", init_data_type); // send from master to slave to initialize data bA,bB gras_msgtype_declare("ask_result", gras_datadesc_by_name("int")); // send from master to slave to ask a final result @@ -63,7 +66,7 @@ int master (int argc,char *argv[]); /* Global private data */ typedef struct { - int nbr_col,nbr_row; + int nbr_row,nbr_line; int remaining_step; int remaining_ack; } master_data_t; @@ -74,7 +77,7 @@ typedef struct { static void initmatrix(matrix_t *X){ int i; - for(i=0 ; i<(X->rows)*(X->cols); i++) + for(i=0 ; i<(X->lines)*(X->rows); i++) X->data[i]=1.0;//*rand()/(RAND_MAX+1.0); } /* end_of_initmatrixs */ @@ -109,22 +112,22 @@ static void display(matrix_t X){ int i,j,t=0; printf(" "); - for(j=0;j PROC_MATRIX_SIZE) { + line=1; + row++; + } - mydata.a=A.data[(mydata.myrow-1)*MATRIX_SIZE+(mydata.mycol-1)]; - mydata.b=B.data[(mydata.myrow-1)*MATRIX_SIZE+(mydata.mycol-1)];; + mydata.a=A.data[(mydata.myline-1)*PROC_MATRIX_SIZE+(mydata.myrow-1)]; + mydata.b=B.data[(mydata.myline-1)*PROC_MATRIX_SIZE+(mydata.myrow-1)];; gras_msg_send(socket[j],gras_msgtype_by_name("init_data"),&mydata); - INFO3("Send Init Data to %s : data A= %.3g & data B= %.3g",gras_socket_peer_name(socket[j]),mydata.a,mydata.b); + INFO3("Send Init Data to %s : data A= %.3g & data B= %.3g", + gras_socket_peer_name(socket[j]),mydata.a,mydata.b); j++; - } // end init Data Send + } + // end init Data Send /******************************* multiplication ********************************/ - INFO0("begin Multiplication"); + INFO0("XXXXXXXXXXXXXXXXXXXXXX begin Multiplication"); - for (step=1; step <= MATRIX_SIZE; step++){ - gras_os_sleep(50); + for (step=1; step <= PROC_MATRIX_SIZE; step++){ + // gras_os_sleep(50); for (i=0; i< SLAVE_COUNT; i++){ TRY { - gras_msg_send(socket[i], gras_msgtype_by_name("step"), &step); /* initialize Mycol, MyRow, mydataA,mydataB*/ + 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"); @@ -228,7 +240,7 @@ int master (int argc,char *argv[]) { /* wait for results */ for( i=1;i< argc;i++){ gras_msg_wait(600,gras_msgtype_by_name("result"),&from,&result); - C.data[(result.i-1)*MATRIX_SIZE+(result.j-1)]=result.value; + C.data[(result.i-1)*DATA_MATRIX_SIZE+(result.j-1)]=result.value; } /* end of gather */ INFO0 ("The Result of Multiplication is :"); @@ -248,7 +260,7 @@ int slave(int argc,char *argv[]) { int step,port,l,result_ack=0; double bA,bB; - int myrow,mycol; + int myline,myrow; double mydataA,mydataB; double bC=0; @@ -256,9 +268,11 @@ int slave(int argc,char *argv[]) { result_t result; - gras_socket_t from,sock; /* to recive from server for steps */ + gras_socket_t from,sock; /* to receive from server for steps */ - gras_socket_t socket_row[MATRIX_SIZE-1],socket_column[MATRIX_SIZE-1]; /* sockets for brodcast to other slave */ + /* sockets for brodcast to other slave */ + gras_socket_t socket_line[PROC_MATRIX_SIZE-1]; + gras_socket_t socket_row[PROC_MATRIX_SIZE-1]; /* Init the GRAS's infrastructure */ @@ -274,9 +288,9 @@ int slave(int argc,char *argv[]) { gras_os_sleep(1); //wait to start all slaves int i; - for (i=1;i Myrow(%d)",step,myrow); + if(myline != step){ + INFO2("step(%d) <> Myline(%d)",step,myline); TRY { gras_msg_wait(600,gras_msgtype_by_name("dataB"), &from,&bB); } CATCH(e) { - RETHROW0("I Can't get a data message from row : %s"); + RETHROW0("I Can't get a data message from line : %s"); } - INFO2("Recive data B (%.3g) from my neighbor: %s",bB,gras_socket_peer_name(from)); + INFO2("Receive data B (%.3g) from my neighbor: %s",bB,gras_socket_peer_name(from)); } - /* a column brodcast */ - if(mycol==step){ - for (l=1;l < MATRIX_SIZE ;l++){ - gras_msg_send(socket_row[l-1],gras_msgtype_by_name("dataA"), &mydataA); + /* 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); bA=mydataA; INFO1("send my data A (%.3g) to my (horizontal) neighbors",bA); } } - if(mycol != step){ + if(myrow != step){ TRY { gras_msg_wait(1200,gras_msgtype_by_name("dataA"), &from,&bA); } CATCH(e) { - RETHROW0("I Can't get a data message from column : %s"); + RETHROW0("I Can't get a data message from row : %s"); } - INFO2("Recive data A (%.3g) from my neighbor : %s ",bA,gras_socket_peer_name(from)); + INFO2("Receive data A (%.3g) from my neighbor : %s ",bA,gras_socket_peer_name(from)); } bC+=bA*bB; INFO1(">>>>>>>> My BC = %.3g",bC); @@ -356,20 +370,20 @@ int slave(int argc,char *argv[]) { INFO1("Send ack to master for to end %d th step",step); } - if(step==MATRIX_SIZE-1) break; + if(step==PROC_MATRIX_SIZE-1) break; - } while (step < MATRIX_SIZE); + } while (step < PROC_MATRIX_SIZE); /* wait Message from master to send the result */ result.value=bC; - result.i=myrow; - result.j=mycol; + result.i=myline; + result.j=myrow; TRY { gras_msg_wait(600,gras_msgtype_by_name("ask_result"), &from,&result_ack); } CATCH(e) { - RETHROW0("I Can't get a data message from row : %s"); + RETHROW0("I Can't get a data message from line : %s"); } /* send Result to master */ TRY {