X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/82ef813a5d1cf608e1ae2a80c306a1cee9fceab1..ef9f1f9d8218d82bb3c1d55ca3fd53df9a723edb:/examples/gras/pmm/pmm.c diff --git a/examples/gras/pmm/pmm.c b/examples/gras/pmm/pmm.c index 45f427e39b..7d20b7c8d2 100755 --- a/examples/gras/pmm/pmm.c +++ b/examples/gras/pmm/pmm.c @@ -10,10 +10,13 @@ #include "gras.h" #include "xbt/matrix.h" -#define PROC_MATRIX_SIZE 2 +#include "amok/peermanagement.h" + +#define PROC_MATRIX_SIZE 3 +#define NEIGHBOR_COUNT PROC_MATRIX_SIZE - 1 #define SLAVE_COUNT (PROC_MATRIX_SIZE*PROC_MATRIX_SIZE) -#define DATA_MATRIX_SIZE 8 +#define DATA_MATRIX_SIZE 18 const int submatrix_size = DATA_MATRIX_SIZE/PROC_MATRIX_SIZE; XBT_LOG_NEW_DEFAULT_CATEGORY(pmm,"Parallel Matrix Multiplication"); @@ -27,30 +30,30 @@ GRAS_DEFINE_TYPE(s_result,struct s_result { typedef struct s_result result_t; /* struct to send initial data to slave */ -GRAS_DEFINE_TYPE(s_assignment,struct s_assignment { +GRAS_DEFINE_TYPE(s_pmm_assignment,struct s_pmm_assignment { int linepos; int rowpos; - xbt_host_t line[PROC_MATRIX_SIZE]; - xbt_host_t row[PROC_MATRIX_SIZE]; + xbt_peer_t line[NEIGHBOR_COUNT]; + xbt_peer_t row[NEIGHBOR_COUNT]; xbt_matrix_t A GRAS_ANNOTE(subtype,double); xbt_matrix_t B GRAS_ANNOTE(subtype,double); }); -typedef struct s_assignment s_assignment_t; +typedef struct s_pmm_assignment s_pmm_assignment_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 assignment_type; + gras_datadesc_type_t pmm_assignment_type; - gras_datadesc_set_const("PROC_MATRIX_SIZE",PROC_MATRIX_SIZE); + gras_datadesc_set_const("NEIGHBOR_COUNT",NEIGHBOR_COUNT); result_type=gras_datadesc_by_symbol(s_result); - assignment_type=gras_datadesc_by_symbol(s_assignment); + pmm_assignment_type=gras_datadesc_by_symbol(s_pmm_assignment); /* receive a final result from slave */ gras_msgtype_declare("result", result_type); /* send from master to slave to assign a position and some data */ - gras_msgtype_declare("assignment", assignment_type); + gras_msgtype_declare("pmm_slave", pmm_assignment_type); /* send data between slaves */ gras_msgtype_declare("dataA", gras_datadesc_matrix(gras_datadesc_by_name("double"),NULL)); @@ -74,85 +77,85 @@ typedef struct { } master_data_t; -/*** Function Scatter Sequentiel ***/ - -static void scatter(){ - -}/* end_of_Scatter */ - -/*** Function: Scatter // ***/ - -static void scatter_parl(){ - -}/* end_of_Scatter // */ - -/*** Function: multiplication ***/ - -static void multiplication(){ - -}/* end_of_multiplication */ - -/*** Function: gather ***/ - -static void gather(){ - -}/* end_of_gather */ - int master (int argc,char *argv[]) { - int i,port; + int i; xbt_matrix_t A,B,C; result_t result; gras_socket_t from; - - xbt_host_t grid[SLAVE_COUNT]; /* The slaves */ + xbt_dynar_t peers; /* group of slaves */ + xbt_peer_t grid[SLAVE_COUNT]; /* The slaves as an array */ gras_socket_t socket[SLAVE_COUNT]; /* sockets for brodcast to slaves */ - /* Init the GRAS's infrastructure */ + /* Init the GRAS's infrastructure */ gras_init(&argc, argv); + amok_pm_init(); register_messages(); - /* Initialize Matrices */ + /* Initialize data 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); - /* Get arguments and create sockets */ - port=atoi(argv[1]); - //scatter(); - //scatter_parl(); - //multiplication(); - //gather(); - /************************* Init Data Send *********************************/ - gras_os_sleep(2); - - for( i=1;iname,grid[i-1]->port); - - INFO2("Connected to %s:%d.",grid[i-1]->name,grid[i-1]->port); + /* Create the connexions */ + xbt_assert0(argc>1, "Usage: master "); + gras_socket_server(atoi(argv[1])); + peers=amok_pm_group_new("pmm"); + + /* friends, we're ready. Come and play */ + INFO0("Wait for peers for 5 sec"); + gras_msg_handleall(5); + INFO1("Got %ld pals",xbt_dynar_length(peers)); + + for (i=0; + iname,grid[i]->port); + socket[i]=gras_socket_client(grid[i]->name,grid[i]->port); + INFO2("Connected to %s:%d.",grid[i]->name,grid[i]->port); } - xbt_assert2(i-1==SLAVE_COUNT, + xbt_assert2(i==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 */ - + i,SLAVE_COUNT); + + /* Kill surnumerous slaves */ + for (i=SLAVE_COUNT; iname, h->port); + amok_pm_kill_hp(h->name,h->port); + free(h); + } + + + /* Assign job to slaves */ int row=0, line=0; INFO0("XXXXXXXXXXXXXXXXXXXXXX begin Multiplication"); for(i=0 ; i50) to be displayed here",DATA_MATRIX_SIZE); + INFO1("Matrix size too big (%d>30) to be displayed here",DATA_MATRIX_SIZE); } + amok_pm_group_shutdown ("pmm"); /* Ok, we're out of here */ + for(i=0; iname)) { - socket_line[j]=gras_socket_client(assignment.line[i]->name, - assignment.line[i]->port); - j++; - } - xbt_host_free(assignment.line[i]); + for (i=0 ; iname, + assignment.line[i]->port); + xbt_peer_free(assignment.line[i]); } - for (i=0,j=0 ; iname)) { - socket_row[j]=gras_socket_client(assignment.row[i]->name, - assignment.row[i]->port); - j++; - } - xbt_host_free(assignment.row[i]); + for (i=0 ; iname, + assignment.row[i]->port); + xbt_peer_free(assignment.row[i]); } for (step=0; step>>>>>>> Result sent to %s:%d <<<<<<<<", gras_socket_peer_name(master),gras_socket_peer_port(master)); @@ -347,19 +343,44 @@ int slave(int argc,char *argv[]) { 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 * + /* FIXME: some are said to be unknown 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]); }*/ - + return 1; +} + +int slave(int argc,char *argv[]) { + gras_socket_t mysock; + gras_socket_t master; + + /* Init the GRAS's infrastructure */ + gras_init(&argc, argv); + amok_pm_init(); + + /* Register the known messages and my callback */ + register_messages(); + gras_cb_register(gras_msgtype_by_name("pmm_slave"),pmm_worker_cb); + + /* Create the connexions */ + mysock = gras_socket_server_range(3000,9999,0,0); + gras_os_sleep(1); /* let the master get ready */ + INFO1("Sensor starting (on port %d)",gras_os_myport()); + master = gras_socket_client_from_string(argv[1]); + + /* Join and run the group */ + amok_pm_group_join(master,"pmm"); + amok_pm_mainloop(600); + + /* housekeeping */ + gras_socket_close(mysock); + // gras_socket_close(master); Unknown gras_exit(); - INFO0("Done."); return 0; } /* end_of_slave */