1 /* Example of traces replay without context switches, running MPI actions */
3 /* Copyright (c) 2010. The SimGrid Team.
4 * All rights reserved. */
6 /* This program is free software; you can redistribute it and/or modify it
7 * under the terms of the license (GNU LGPL) which comes with this package. */
14 #include "xbt/dynar.h"
15 #include "simix/smurf_private.h"
17 XBT_LOG_NEW_DEFAULT_CATEGORY(mpi_replay,"MPI replayer");
21 static double parse_double(const char *string) {
25 value = strtod(string, &endptr);
27 THROW1(unknown_error, 0, "%s is not a double", string);
30 static int get_rank (const char *process_name){
31 return atoi(&(process_name[1]));
34 const char *state_name[] = {
36 "compute0", "compute1", "compute2",
37 "send0","send1","send2","send3",
44 e_mpi_pump_evt_trace=0,
45 e_mpi_compute0,e_mpi_compute1,e_mpi_compute2,
46 e_mpi_send0,e_mpi_send1,e_mpi_send2,e_mpi_send3,
50 e_mpi_init0,e_mpi_init1
51 } e_mpi_replay_state_t;
57 e_mpi_replay_state_t state;
59 replay_trace_reader_t reader;
60 const char * const*evt;
64 xbt_dynar_t isends; /* of msg_comm_t, cleaned up automatically on send event */
65 } s_mpi_replay_t, *mpi_replay_t;
67 static void *mpi_replay_init(int argc, char *argv[]) {
69 mpi_replay_t res = xbt_new0(s_mpi_replay_t,1);
70 res->procname = xbt_strdup(argv[0]);
71 res->state = e_mpi_pump_evt_trace;
73 res->reader = replay_trace_reader_new(argv[1]);
77 static void mpi_replay_run(void*data,void *syscall_res) {
78 mpi_replay_t g = (mpi_replay_t)data; /* my globals */
81 INFO2("mpi_replay_run, state=%s (%d)",state_name[g->state],g->state);
85 case e_mpi_pump_evt_trace: { /* nothing to do, parse next event and call function again */
87 g->evt = replay_trace_reader_get(g->reader);
88 if (strcmp(g->procname, g->evt[0])) {
89 WARN1("Ignore trace element not for me at %s",
90 replay_trace_reader_position(g->reader));
94 if (!strcmp(g->evt[1],"send")) {
95 g->state = e_mpi_send0;
97 } else if (!strcmp(g->evt[1],"recv")) {
98 g->state = e_mpi_recv0;
100 } else if (!strcmp(g->evt[1],"irecv")||!strcmp(g->evt[1],"Irecv")) {
101 g->state = e_mpi_irecv0;
103 } else if (!strcmp(g->evt[1],"wait")) {
104 g->state = e_mpi_wait0;
106 } else if (!strcmp(g->evt[1],"compute")) {
107 g->state = e_mpi_compute0;
109 } else if (!strcmp(g->evt[1],"init")) {
110 g->state = e_mpi_init0;
113 WARN2("Ignoring unrecognized trace element at %s: %s",
114 replay_trace_reader_position(g->reader),g->evt[1]);
122 sprintf(to, "%s_%s", g->procname, g->evt[2]);
124 DEBUG2("Entering Send at %s (size: %lg)",
125 replay_trace_reader_position(g->reader), parse_double(g->evt[3]));
126 g->state = e_mpi_send1;
127 SIMIX_req_rdv_create(to);
131 g->state = e_mpi_send2;
132 SIMIX_req_comm_isend(syscall_res, parse_double(g->evt[3]),-1,
133 NULL,0,//void *src_buff, size_t src_buff_size,
134 NULL,NULL);//int (*match_fun)(void *, void *), void *data)
137 if (parse_double(g->evt[3])<65536) {
138 xbt_dynar_push(g->isends,&syscall_res);
139 g->state = e_mpi_pump_evt_trace;
142 g->act = syscall_res;
143 g->state=e_mpi_send3;
144 SIMIX_req_comm_wait(g->act,-1);
146 g->state=e_mpi_pump_evt_trace;
147 SIMIX_req_comm_destroy(g->act);
149 /* *** Computation *** */
151 g->state = e_mpi_compute1;
152 SIMIX_req_host_execute(replay_trace_reader_position(g->reader),
153 g->myhost,parse_double(g->evt[2]));
156 g->act = syscall_res;
157 g->state = e_mpi_compute2;
158 SIMIX_req_host_execution_wait(g->act);
161 g->state = e_mpi_pump_evt_trace;
162 SIMIX_req_host_execution_destroy(g->act);
165 case e_mpi_irecv0: xbt_die("irecv0 unimplemented");
166 case e_mpi_recv0: xbt_die("recv0 unimplemented");
167 case e_mpi_wait0: xbt_die("wait0 unimplemented");
169 g->state = e_mpi_init1;
170 SIMIX_req_process_get_host(SIMIX_process_self());
173 g->myhost = syscall_res;
174 g->state = e_mpi_pump_evt_trace;
180 static void mpi_replay_fini(void *data) {
181 mpi_replay_t g = (mpi_replay_t)data;
182 replay_trace_reader_free(&g->reader);
186 int main(int argc, char *argv[]) {
187 SG_replay_init(&argc,argv);
189 fprintf(stderr,"USAGE: replay platform_file deployment_file\n");
192 SG_replay_set_functions(mpi_replay_init,mpi_replay_run,mpi_replay_fini);
193 SG_replay(argv[1],argv[2]);