X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5a5c4a0d5915bb7a2b308e061bbf5f5c90e20575..85df79fc9b50c1121f01b0a1adc4879f4622aaf5:/examples/gras/pmm/pmm.c diff --git a/examples/gras/pmm/pmm.c b/examples/gras/pmm/pmm.c index 15412760cd..be2cdbf492 100755 --- a/examples/gras/pmm/pmm.c +++ b/examples/gras/pmm/pmm.c @@ -1,55 +1,61 @@ -/* pmm - paralel matrix multiplication "double diffusion" */ +/* $Id$ */ +/* pmm - parallel matrix multiplication "double diffusion" */ -/* Copyright (c) 2006- Ahmed Harbaoui. All rights reserved. */ +/* Copyright (c) 2006- Ahmed Harbaoui. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * 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 rows; - int cols; - double *data GRAS_ANNOTE(size, rows*cols); + int lines; + int rows; + 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; + 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 myrow; - int mycol; - double a; - double b; + int linepos; + int rowpos; + xbt_host_t line[PROC_MATRIX_SIZE]; + xbt_host_t row[PROC_MATRIX_SIZE]; + double a; + double b; }); typedef struct s_init_data init_data_t; /* register messages which may be sent (common to client and server) */ static void register_messages(void) { - gras_datadesc_type_t result_type; - gras_datadesc_type_t init_data_type; - result_type=gras_datadesc_by_symbol(s_result); - init_data_type=gras_datadesc_by_symbol(s_init_data); + gras_datadesc_type_t result_type; + gras_datadesc_type_t init_data_type; + gras_datadesc_set_const("PROC_MATRIX_SIZE",PROC_MATRIX_SIZE); + 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("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 - gras_msgtype_declare("step", gras_datadesc_by_name("int"));// send from master to slave to indicate the begining of step - gras_msgtype_declare("step_ack", gras_datadesc_by_name("int"));//send from slave to master to indicate the end of the current step - 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 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 + gras_msgtype_declare("step", gras_datadesc_by_name("int"));// send from master to slave to indicate the begining of step + gras_msgtype_declare("step_ack", gras_datadesc_by_name("int"));//send from slave to master to indicate the end of the current step + 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 slave } /* Function prototypes */ @@ -63,7 +69,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; @@ -72,10 +78,10 @@ typedef struct { /*** Function initilaze matrixs ***/ static void initmatrix(matrix_t *X){ -int i; + int i; -for(i=0 ; i<(X->rows)*(X->cols); i++) - X->data[i]=1.0;//*rand()/(RAND_MAX+1.0); + for(i=0 ; i<(X->lines)*(X->rows); i++) + X->data[i]=1.0;//*rand()/(RAND_MAX+1.0); } /* end_of_initmatrixs */ /*** Function Scatter Sequentiel ***/ @@ -106,135 +112,153 @@ static void gather(){ static void display(matrix_t X){ -int i,j,t=0; + int i,j,t=0; printf(" "); - for(j=0;jname,grid[i-1]->port); + + INFO2("Connected to %s:%d.",grid[i-1]->name,grid[i-1]->port); + } + + int row=1, line=1,j; + for(i=0 ; i PROC_MATRIX_SIZE) { + row=1; + line++; + } - 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[(line-1)*PROC_MATRIX_SIZE+(row-1)]; + mydata.b=B.data[(line-1)*PROC_MATRIX_SIZE+(row-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); - j++; - } // end init Data Send + gras_msg_send(socket[i],gras_msgtype_by_name("init_data"),&mydata); + INFO3("Send Init Data to %s : data A= %.3g & data B= %.3g", + gras_socket_peer_name(socket[i]),mydata.a,mydata.b); + + } + // end init Data Send - /******************************* multiplication ********************************/ - INFO0("begin Multiplication"); + /******************************* multiplication ********************************/ + INFO0("XXXXXXXXXXXXXXXXXXXXXX begin Multiplication"); - for (step=1; step <= 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*/ - } CATCH(e) { - gras_socket_close(socket[i]); - RETHROW0("Unable to send the msg : %s"); - } - } - INFO1("send to slave to begin a %d th step",step); - /* wait for computing and slave messages exchange */ - i=0; + 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); + } CATCH(e) { + gras_socket_close(socket[i]); + RETHROW0("Unable to send the msg : %s"); + } + } + INFO1("send to slave to begin a %d th step",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("I Can't get a Ack step message from slave : %s"); - } - i++; - INFO3("Receive Ack step ack from %s (got %d of %d)", - gras_socket_peer_name(from), - i, SLAVE_COUNT); - } - } - /********************************* gather ***************************************/ + while ( i< SLAVE_COUNT){ + TRY { + gras_msg_wait(1300,gras_msgtype_by_name("step_ack"),&from,&step_ack); + } CATCH(e) { + RETHROW0("I Can't get a Ack step message from slave : %s"); + } + i++; + INFO3("Receive Ack 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); - C.data[(result.i-1)*MATRIX_SIZE+(result.j-1)]=result.value; - } - /* end of gather */ - INFO0 ("The Result of Multiplication is :"); - display(C); + 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); + C.data[(result.i-1)*DATA_MATRIX_SIZE+(result.j-1)]=result.value; + } + /* end of gather */ + INFO0 ("The Result of Multiplication is :"); + display(C); -return 0; + return 0; } /* end_of_master */ /* ********************************************************************** @@ -248,17 +272,19 @@ 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; -// static end_step; + // static end_step; 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 */ @@ -270,120 +296,133 @@ int slave(int argc,char *argv[]) { /* Create my master socket */ sock = gras_socket_server(port); - INFO2("Launch %s (port=%d)",argv[0],port); - gras_os_sleep(1); //wait to start all slaves - int i; - for (i=1;iname)) { + socket_line[j]=gras_socket_client(mydata.line[i]->name,mydata.line[i]->port); + j++; + //INFO3("Line neighbour %d: %s:%d",j,mydata.line[i]->name,mydata.line[i]->port); + } + xbt_host_free(mydata.line[i]); + } + for (i=0,j=0 ; iname)) { + socket_row[j]=gras_socket_client(mydata.row[i]->name,mydata.row[i]->port); + //INFO3("Row neighbour %d : %s:%d",j,mydata.row[i]->name,mydata.row[i]->port); + j++; + } + xbt_host_free(mydata.row[i]); + } + step=1; do { //repeat until compute Cb - step=MATRIX_SIZE+1; // just intilization for loop + step=PROC_MATRIX_SIZE+1; // just intilization for loop - TRY { - gras_msg_wait(200,gras_msgtype_by_name("step"),&from,&step); - } CATCH(e) { - RETHROW0("I Can't get a Next Step message from master : %s"); - } - INFO1("Recive a step message from master: step = %d ",step); - - if (step < MATRIX_SIZE ){ - /* a row brodcast */ - gras_os_sleep(3); // IL FAUT EXPRIMER LE TEMPS D'ATTENTE EN FONCTION DE "SLAVE_COUNT" - if(myrow==step){ - INFO2("step(%d) = Myrow(%d)",step,myrow); - for (l=1;l < MATRIX_SIZE ;l++){ - gras_msg_send(socket_column[l-1], gras_msgtype_by_name("dataB"), &mydataB); - bB=mydataB; - INFO1("send my data B (%.3g) to my (vertical) neighbors",bB); - } + TRY { + gras_msg_wait(200,gras_msgtype_by_name("step"),&from,&step); + } CATCH(e) { + RETHROW0("Can't get a Next Step message from master : %s"); + } + INFO1("Receive a step message from master: step = %d ",step); + + if (step < PROC_MATRIX_SIZE ){ + /* a line brodcast */ + gras_os_sleep(3); // IL FAUT EXPRIMER LE TEMPS D'ATTENTE EN FONCTION DE "SLAVE_COUNT" + if(myline==step){ + INFO2("step(%d) = Myline(%d)",step,myline); + for (l=1;l < PROC_MATRIX_SIZE ;l++){ + gras_msg_send(socket_row[l-1], gras_msgtype_by_name("dataB"), &mydataB); + bB=mydataB; + INFO1("send my data B (%.3g) to my (vertical) neighbors",bB); } - if(myrow != step){ - INFO2("step(%d) <> Myrow(%d)",step,myrow); - 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"); - } - INFO2("Recive 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); - bA=mydataA; - INFO1("send my data A (%.3g) to my (horizontal) neighbors",bA); - } - } - - if(mycol != 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"); - } - INFO2("Recive data A (%.3g) from my neighbor : %s ",bA,gras_socket_peer_name(from)); + } + 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 line : %s"); } - bC+=bA*bB; - INFO1(">>>>>>>> My BC = %.3g",bC); + INFO2("Receive data B (%.3g) from my neighbor: %s",bB,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); + bA=mydataA; + INFO1("send my data A (%.3g) to my (horizontal) neighbors",bA); + } + } + + 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 row : %s"); + } + INFO2("Receive data A (%.3g) from my neighbor : %s ",bA,gras_socket_peer_name(from)); + } + bC+=bA*bB; + INFO1(">>>>>>>> My BC = %.3g",bC); - /* send a ack msg to master */ + /* send a ack msg to master */ - gras_msg_send(from,gras_msgtype_by_name("step_ack"),&step); + gras_msg_send(from,gras_msgtype_by_name("step_ack"),&step); - INFO1("Send ack to master for to end %d th step",step); - } - if(step==MATRIX_SIZE-1) break; + INFO1("Send ack to master for to end %d th step",step); + } + if(step==PROC_MATRIX_SIZE-1) break; - } while (step < MATRIX_SIZE); - /* wait Message from master to send the result */ + } while (step < PROC_MATRIX_SIZE); + /* wait Message from master to send the result */ - result.value=bC; - result.i=myrow; - result.j=mycol; + result.value=bC; + 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"); - } - /* send Result to master */ - TRY { - gras_msg_send(from, gras_msgtype_by_name("result"),&result); - } CATCH(e) { - // gras_socket_close(from); - RETHROW0("Failed to send PING to server: %s"); - } - INFO3(">>>>>>>> Result: %.3f sent to %s:%d <<<<<<<<", - bC, - gras_socket_peer_name(from),gras_socket_peer_port(from)); - /* Free the allocated resources, and shut GRAS down */ - gras_socket_close(from); - gras_exit(); - INFO0("Done."); - return 0; + 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 line : %s"); + } + /* send Result to master */ + TRY { + gras_msg_send(from, gras_msgtype_by_name("result"),&result); + } CATCH(e) { + // gras_socket_close(from); + RETHROW0("Failed to send PING to server: %s"); + } + INFO3(">>>>>>>> Result: %.3f sent to %s:%d <<<<<<<<", + bC, + gras_socket_peer_name(from),gras_socket_peer_port(from)); + /* Free the allocated resources, and shut GRAS down */ + gras_socket_close(from); + gras_exit(); + INFO0("Done."); + return 0; } /* end_of_slave */