/* $Id$ */
/* pmm - parallel matrix multiplication "double diffusion" */
-/* Copyright (c) 2006 Ahmed Harbaoui. */
-/* Copyright (c) 2006 Martin Quinson. */
-/* All rights reserved. */
+/* Copyright (c) 2006-2008 The SimGrid team. 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. */
i++) {
xbt_dynar_get_cpy(peers,i,&grid[i]);
- INFO2("Connecting to %s:%d.",grid[i]->name,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==SLAVE_COUNT,
"Not enough slaves for this setting (got %d of %d). Change the deployment file",
line++;
}
- gras_msg_send(socket[i],gras_msgtype_by_name("pmm_slave"),&assignment);
+ gras_msg_send(socket[i],"pmm_slave",&assignment);
xbt_matrix_free(assignment.A);
xbt_matrix_free(assignment.B);
}
/* Retrieve the results */
for( i=0;i< SLAVE_COUNT;i++){
- gras_msg_wait(6000,gras_msgtype_by_name("result"),&from,&result);
+ gras_msg_wait(6000,"result",&from,&result);
VERB2("%d slaves are done already. Waiting for %d",i+1, SLAVE_COUNT);
xbt_matrix_copy_values(C,result.C, submatrix_size,submatrix_size,
submatrix_size*result.linepos,
/* a line brodcast */
if(myline==step){
- INFO3("LINE: step(%d) = Myline(%d). Broadcast my data (myport=%d).",
- step,myline,gras_os_myport());
+ INFO2("LINE: step(%d) = Myline(%d). Broadcast my data.",
+ step,myline);
for (l=0;l < PROC_MATRIX_SIZE-1 ;l++) {
- INFO2("LINE: Send to %s:%d",
- gras_socket_peer_name(socket_row[l]),
- gras_socket_peer_port(socket_row[l]));
- gras_msg_send(socket_row[l],
- gras_msgtype_by_name("dataB"),
- &mydataB);
+ INFO1("LINE: Send to %s",
+ gras_socket_peer_name(socket_row[l]));
+ gras_msg_send(socket_row[l], "dataB", &mydataB);
}
} else {
TRY {
xbt_matrix_free(bB);
- gras_msg_wait(600,gras_msgtype_by_name("dataB"),&from,&bB);
+ gras_msg_wait(600,"dataB",&from,&bB);
} CATCH(e) {
RETHROW0("Can't get a data message from line : %s");
}
- INFO4("LINE: step(%d) <> Myline(%d). Receive data from %s:%d",step,myline,
- gras_socket_peer_name(from), gras_socket_peer_port(from));
+ INFO3("LINE: step(%d) <> Myline(%d). Receive data from %s",step,myline,
+ gras_socket_peer_name(from));
}
/* a row brodcast */
if (myrow==step) {
- INFO2("ROW: step(%d)=myrow(%d). Broadcast my data",step,myrow);
+ INFO2("ROW: step(%d)=myrow(%d). Broadcast my data.",step,myrow);
for (l=1;l < PROC_MATRIX_SIZE ; l++) {
- INFO2("ROW: Send to %s:%d",
- gras_socket_peer_name(socket_line[l-1]),
- gras_socket_peer_port(socket_line[l-1]));
- gras_msg_send(socket_line[l-1],gras_msgtype_by_name("dataA"), &mydataA);
+ INFO1("ROW: Send to %s",
+ gras_socket_peer_name(socket_line[l-1]));
+ gras_msg_send(socket_line[l-1],"dataA", &mydataA);
}
xbt_matrix_free(bA);
bA = xbt_matrix_new_sub(mydataA,
} else {
TRY {
xbt_matrix_free(bA);
- gras_msg_wait(1200,gras_msgtype_by_name("dataA"), &from,&bA);
+ gras_msg_wait(1200,"dataA", &from,&bA);
} CATCH(e) {
RETHROW0("Can't get a data message from row : %s");
}
result.rowpos=myrow;
TRY {
- gras_msg_send(master, gras_msgtype_by_name("result"),&result);
+ gras_msg_send(master, "result",&result);
} CATCH(e) {
RETHROW0("Failed to send answer to server: %s");
}
xbt_matrix_free(mydataA);
xbt_matrix_free(mydataB);
+ /* FIXME: some are said to be unknown
gras_socket_close(master);
gras_socket_close(from);
- /* 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]);
gras_socket_close(socket_row[l]);
}*/
- return 1;
+ return 0;
}
int slave(int argc,char *argv[]) {
gras_socket_t mysock;
- gras_socket_t master;
+ gras_socket_t master = NULL;
+ int connected = 0;
+ int rank;
/* Init the GRAS's infrastructure */
gras_init(&argc, argv);
amok_pm_init();
+ if (argc != 3 && argc !=2)
+ xbt_die("Usage: slave masterhost:masterport [rank]");
+ if (argc == 2)
+ rank = -1;
+ else
+ rank = atoi(argv[2]);
/* Register the known messages and my callback */
register_messages();
/* 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]);
+ INFO1("Sensor %d starting",rank);
+ while (!connected) {
+ xbt_ex_t e;
+ TRY {
+ master = gras_socket_client_from_string(argv[1]);
+ connected = 1;
+ } CATCH(e) {
+ if (e.category != system_error)
+ RETHROW;
+ xbt_ex_free(e);
+ gras_os_sleep(0.5);
+ }
+ }
/* Join and run the group */
- amok_pm_group_join(master,"pmm");
+ amok_pm_group_join(master,"pmm",rank);
amok_pm_mainloop(600);
/* housekeeping */