A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use new style logging macros.
[simgrid.git]
/
examples
/
gras
/
pmm
/
pmm.c
diff --git
a/examples/gras/pmm/pmm.c
b/examples/gras/pmm/pmm.c
old mode 100755
(executable)
new mode 100644
(file)
index
c6a3860
..
bb48e39
--- a/
examples/gras/pmm/pmm.c
+++ b/
examples/gras/pmm/pmm.c
@@
-1,6
+1,7
@@
/* pmm - parallel matrix multiplication "double diffusion" */
/* pmm - parallel matrix multiplication "double diffusion" */
-/* Copyright (c) 2006-2008 The SimGrid team. All rights reserved. */
+/* Copyright (c) 2006, 2007, 2008, 2009, 2010. 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. */
/* 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. */
@@
-20,8
+21,9
@@
XBT_LOG_NEW_DEFAULT_CATEGORY(pmm, "Parallel Matrix Multiplication");
/* struct for recovering results */
GRAS_DEFINE_TYPE(s_result, struct s_result {
/* struct for recovering results */
GRAS_DEFINE_TYPE(s_result, struct s_result {
- int linepos;
- int rowpos; xbt_matrix_t C GRAS_ANNOTE(subtype, double);});
+ int linepos; int rowpos;
+ xbt_matrix_t C GRAS_ANNOTE(subtype, double);
+ });
typedef struct s_result result_t;
typedef struct s_result result_t;
@@
-32,7
+34,8
@@
GRAS_DEFINE_TYPE(s_pmm_assignment, struct s_pmm_assignment {
xbt_peer_t line[NEIGHBOR_COUNT];
xbt_peer_t row[NEIGHBOR_COUNT];
xbt_matrix_t A GRAS_ANNOTE(subtype, double);
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);});
+ xbt_matrix_t B GRAS_ANNOTE(subtype, double);
+ });
typedef struct s_pmm_assignment s_pmm_assignment_t;
typedef struct s_pmm_assignment s_pmm_assignment_t;
@@
-54,11
+57,14
@@
static void register_messages(void)
/* send data between slaves */
gras_msgtype_declare("dataA",
/* send data between slaves */
gras_msgtype_declare("dataA",
- gras_datadesc_matrix(gras_datadesc_by_name
("double"),
- NULL));
+ gras_datadesc_matrix(gras_datadesc_by_name
+
("double"),
NULL));
gras_msgtype_declare("dataB",
gras_msgtype_declare("dataB",
- gras_datadesc_matrix(gras_datadesc_by_name("double"),
- NULL));
+ gras_datadesc_matrix(gras_datadesc_by_name
+ ("double"), NULL));
+
+ /* synchronization message */
+ gras_msgtype_declare("pmm_sync", 0);
}
/* Function prototypes */
}
/* Function prototypes */
@@
-107,13
+113,14
@@
int master(int argc, char *argv[])
peers = amok_pm_group_new("pmm");
/* friends, we're ready. Come and play */
peers = amok_pm_group_new("pmm");
/* friends, we're ready. Come and play */
-
INFO0
("Wait for peers for 2 sec");
+
XBT_INFO
("Wait for peers for 2 sec");
gras_msg_handleall(2);
gras_msg_handleall(2);
- while (xbt_dynar_length(peers)<9) {
- INFO1("Got only %ld pals. Wait 2 more seconds", xbt_dynar_length(peers));
+ while (xbt_dynar_length(peers) < SLAVE_COUNT) {
+ XBT_INFO("Got only %ld pals (of %d). Wait 2 more seconds",
+ xbt_dynar_length(peers),SLAVE_COUNT);
gras_msg_handleall(2);
}
gras_msg_handleall(2);
}
-
INFO1
("Good. Got %ld pals", xbt_dynar_length(peers));
+
XBT_INFO
("Good. Got %ld pals", xbt_dynar_length(peers));
for (i = 0; i < xbt_dynar_length(peers) && i < SLAVE_COUNT; i++) {
xbt_dynar_get_cpy(peers, i, &grid[i]);
for (i = 0; i < xbt_dynar_length(peers) && i < SLAVE_COUNT; i++) {
xbt_dynar_get_cpy(peers, i, &grid[i]);
@@
-128,7
+135,7
@@
int master(int argc, char *argv[])
xbt_peer_t h;
xbt_dynar_remove_at(peers, i, &h);
xbt_peer_t h;
xbt_dynar_remove_at(peers, i, &h);
-
INFO2
("Too much slaves. Killing %s:%d", h->name, h->port);
+
XBT_INFO
("Too much slaves. Killing %s:%d", h->name, h->port);
amok_pm_kill_hp(h->name, h->port);
free(h);
}
amok_pm_kill_hp(h->name, h->port);
free(h);
}
@@
-136,7
+143,7
@@
int master(int argc, char *argv[])
/* Assign job to slaves */
int row = 0, line = 0;
/* Assign job to slaves */
int row = 0, line = 0;
-
INFO0
("XXXXXXXXXXXXXXXXXXXXXX begin Multiplication");
+
XBT_INFO
("XXXXXXXXXXXXXXXXXXXXXX begin Multiplication");
for (i = 0; i < SLAVE_COUNT; i++) {
s_pmm_assignment_t assignment;
int j, k;
for (i = 0; i < SLAVE_COUNT; i++) {
s_pmm_assignment_t assignment;
int j, k;
@@
-163,8
+170,9
@@
int master(int argc, char *argv[])
submatrix_size * line,
submatrix_size * row, NULL);
assignment.B =
submatrix_size * line,
submatrix_size * row, NULL);
assignment.B =
- xbt_matrix_new_sub(B, submatrix_size, submatrix_size,
- submatrix_size * line, submatrix_size * row, NULL);
+ xbt_matrix_new_sub(B, submatrix_size, submatrix_size,
+ submatrix_size * line, submatrix_size * row,
+ NULL);
row++;
if (row >= PROC_MATRIX_SIZE) {
row = 0;
row++;
if (row >= PROC_MATRIX_SIZE) {
row = 0;
@@
-176,12
+184,20
@@
int master(int argc, char *argv[])
xbt_matrix_free(assignment.B);
}
xbt_matrix_free(assignment.B);
}
- /* (have a rest while the slave perform the multiplication) */
+ /* synchronize slaves */
+ for (i = 0; i < PROC_MATRIX_SIZE; i++) {
+ int j;
+ for (j = 0; j < SLAVE_COUNT; j++)
+ gras_msg_wait(600, "pmm_sync", NULL, NULL);
+ for (j = 0; j < SLAVE_COUNT; j++)
+ gras_msg_send(socket[j], "pmm_sync", NULL);
+ }
/* Retrieve the results */
for (i = 0; i < SLAVE_COUNT; i++) {
gras_msg_wait(6000, "result", &from, &result);
/* Retrieve the results */
for (i = 0; i < SLAVE_COUNT; i++) {
gras_msg_wait(6000, "result", &from, &result);
- VERB2("%d slaves are done already. Waiting for %d", i + 1, SLAVE_COUNT);
+ XBT_VERB("%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,
submatrix_size * result.rowpos, 0, 0, NULL);
xbt_matrix_copy_values(C, result.C, submatrix_size, submatrix_size,
submatrix_size * result.linepos,
submatrix_size * result.rowpos, 0, 0, NULL);
@@
-190,16
+206,16
@@
int master(int argc, char *argv[])
/* end of gather */
if (xbt_matrix_double_is_seq(C))
/* end of gather */
if (xbt_matrix_double_is_seq(C))
-
INFO0
("XXXXXXXXXXXXXXXXXXXXXX Ok, the result matches expectations");
+
XBT_INFO
("XXXXXXXXXXXXXXXXXXXXXX Ok, the result matches expectations");
else {
else {
-
WARN0
("the result seems wrong");
- if (DATA_MATRIX_SIZE < 30) {
-
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>30) to be displayed here",
- DATA_MATRIX_SIZE);
- }
+
XBT_WARN
("the result seems wrong");
+
if (DATA_MATRIX_SIZE < 30) {
+
XBT_INFO
("The Result of Multiplication is :");
+
xbt_matrix_dump(C, "C:res", 0, xbt_matrix_dump_display_double);
+
} else {
+
XBT_INFO
("Matrix size too big (%d>30) to be displayed here",
+
DATA_MATRIX_SIZE);
+
}
}
amok_pm_group_shutdown("pmm"); /* Ok, we're out of here */
}
amok_pm_group_shutdown("pmm"); /* Ok, we're out of here */
@@
-235,7
+251,7
@@
static int pmm_worker_cb(gras_msg_cb_ctx_t ctx, void *payload)
int myline, myrow;
xbt_matrix_t mydataA, mydataB;
xbt_matrix_t bC =
int myline, myrow;
xbt_matrix_t mydataA, mydataB;
xbt_matrix_t bC =
- xbt_matrix_double_new_zeros(submatrix_size, submatrix_size);
+
xbt_matrix_double_new_zeros(submatrix_size, submatrix_size);
result_t result;
result_t result;
@@
-257,9
+273,9
@@
static int pmm_worker_cb(gras_msg_cb_ctx_t ctx, void *payload)
mydataB = assignment.B;
if (gras_if_RL())
mydataB = assignment.B;
if (gras_if_RL())
-
INFO0
("Receive my pos and assignment");
+
XBT_INFO
("Receive my pos and assignment");
else
else
-
INFO2
("Receive my pos (%d,%d) and assignment", myline, myrow);
+
XBT_INFO
("Receive my pos (%d,%d) and assignment", myline, myrow);
/* Get my neighborhood from the assignment message (skipping myself) */
for (i = 0; i < PROC_MATRIX_SIZE - 1; i++) {
/* Get my neighborhood from the assignment message (skipping myself) */
for (i = 0; i < PROC_MATRIX_SIZE - 1; i++) {
@@
-274,12
+290,15
@@
static int pmm_worker_cb(gras_msg_cb_ctx_t ctx, void *payload)
}
for (step = 0; step < PROC_MATRIX_SIZE; step++) {
}
for (step = 0; step < PROC_MATRIX_SIZE; step++) {
+ gras_msg_send(master, "pmm_sync", NULL);
+ gras_msg_wait(600, "pmm_sync", NULL, NULL);
/* a line brodcast */
if (myline == step) {
/* a line brodcast */
if (myline == step) {
- VERB2("LINE: step(%d) = Myline(%d). Broadcast my data.", step, myline);
+ XBT_VERB("LINE: step(%d) = Myline(%d). Broadcast my data.", step,
+ myline);
for (l = 0; l < PROC_MATRIX_SIZE - 1; l++) {
for (l = 0; l < PROC_MATRIX_SIZE - 1; l++) {
-
VERB1
("LINE: Send to %s", gras_socket_peer_name(socket_row[l]));
+
XBT_VERB
("LINE: Send to %s", gras_socket_peer_name(socket_row[l]));
gras_msg_send(socket_row[l], "dataB", &mydataB);
}
gras_msg_send(socket_row[l], "dataB", &mydataB);
}
@@
-295,15
+314,16
@@
static int pmm_worker_cb(gras_msg_cb_ctx_t ctx, void *payload)
CATCH(e) {
RETHROW0("Can't get a data message from line : %s");
}
CATCH(e) {
RETHROW0("Can't get a data message from line : %s");
}
-
VERB3
("LINE: step(%d) <> Myline(%d). Receive data from %s", step,
+
XBT_VERB
("LINE: step(%d) <> Myline(%d). Receive data from %s", step,
myline, gras_socket_peer_name(from));
}
/* a row brodcast */
if (myrow == step) {
myline, gras_socket_peer_name(from));
}
/* a row brodcast */
if (myrow == step) {
-
VERB2
("ROW: step(%d)=myrow(%d). Broadcast my data.", step, myrow);
+
XBT_VERB
("ROW: step(%d)=myrow(%d). Broadcast my data.", step, myrow);
for (l = 1; l < PROC_MATRIX_SIZE; l++) {
for (l = 1; l < PROC_MATRIX_SIZE; l++) {
- VERB1("ROW: Send to %s", gras_socket_peer_name(socket_line[l - 1]));
+ XBT_VERB("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);
gras_msg_send(socket_line[l - 1], "dataA", &mydataA);
}
xbt_matrix_free(bA);
@@
-317,7
+337,7
@@
static int pmm_worker_cb(gras_msg_cb_ctx_t ctx, void *payload)
CATCH(e) {
RETHROW0("Can't get a data message from row : %s");
}
CATCH(e) {
RETHROW0("Can't get a data message from row : %s");
}
-
VERB3
("ROW: step(%d)<>myrow(%d). Receive data from %s", step, myrow,
+
XBT_VERB
("ROW: step(%d)<>myrow(%d). Receive data from %s", step, myrow,
gras_socket_peer_name(from));
}
xbt_matrix_double_addmult(bA, bB, bC);
gras_socket_peer_name(from));
}
xbt_matrix_double_addmult(bA, bB, bC);
@@
-335,7
+355,7
@@
static int pmm_worker_cb(gras_msg_cb_ctx_t ctx, void *payload)
CATCH(e) {
RETHROW0("Failed to send answer to server: %s");
}
CATCH(e) {
RETHROW0("Failed to send answer to server: %s");
}
-
VERB2
(">>>>>>>> Result sent to %s:%d <<<<<<<<",
+
XBT_VERB
(">>>>>>>> Result sent to %s:%d <<<<<<<<",
gras_socket_peer_name(master), gras_socket_peer_port(master));
/* Free the allocated resources, and shut GRAS down */
gras_socket_peer_name(master), gras_socket_peer_port(master));
/* Free the allocated resources, and shut GRAS down */
@@
-381,7
+401,7
@@
int slave(int argc, char *argv[])
/* Create the connexions */
mysock = gras_socket_server_range(3000, 9999, 0, 0);
/* Create the connexions */
mysock = gras_socket_server_range(3000, 9999, 0, 0);
-
INFO1
("Sensor %d starting", rank);
+
XBT_INFO
("Sensor %d starting", rank);
while (!connected) {
xbt_ex_t e;
TRY {
while (!connected) {
xbt_ex_t e;
TRY {