ROSS
phold.main.c
Go to the documentation of this file.
1#include "phold.h"
2
3
6{
7 return (tw_peid) gid / g_tw_nlp;
8}
9
10void
12{
13 (void) s;
14 int i;
15
16 if( stagger )
17 {
18 for (i = 0; i < g_phold_start_events; i++)
19 {
21 tw_event_new(lp->gid,
22 tw_rand_exponential(lp->rng, mean) + lookahead + (tw_stime)(lp->gid % (unsigned int)g_tw_ts_end),
23 lp));
24 }
25 }
26 else
27 {
28 for (i = 0; i < g_phold_start_events; i++)
29 {
31 tw_event_new(lp->gid,
33 lp));
34 }
35 }
36}
37
38void
40{
41 (void) s;
42 tw_lpid dest;
43
45 {
46 dest = tw_rand_integer(lp->rng, 0, ttl_lps - 1);
47 } else
48 {
49 dest = lp->gid;
50 }
51
52 if(dest >= (g_tw_nlp * tw_nnodes()))
53 tw_error(TW_LOC, "bad dest");
54
56}
57
58void
60{
61 (void) s;
62 (void) m;
63 tw_lpid dest;
64
66 {
67 bf->c1 = 1;
68 dest = tw_rand_integer(lp->rng, 0, ttl_lps - 1);
69 // Makes PHOLD non-deterministic across processors! Don't uncomment
70 /* dest += offset_lpid; */
71 /* if(dest >= ttl_lps) */
72 /* dest -= ttl_lps; */
73 } else
74 {
75 bf->c1 = 0;
76 dest = lp->gid;
77 }
78
79 if(dest >= (g_tw_nlp * tw_nnodes()))
80 tw_error(TW_LOC, "bad dest");
81
83}
84
85void
87{
88 (void) s;
89 (void) m;
92
93 if(bf->c1 == 1)
95}
96
98{
99 (void) s;
100 (void) bf;
101 (void) m;
102 (void) lp;
103}
104
105void
107{
108 (void) s;
109 (void) lp;
110}
111
114 /* (pre_run_f) phold_pre_run, */
115 (pre_run_f) NULL,
121 sizeof(phold_state)},
122 {0},
123};
124
125void event_trace(phold_message *m, tw_lp *lp, char *buffer, int *collect_flag)
126{
127 (void) m;
128 (void) lp;
129 (void) buffer;
130 (void) collect_flag;
131 return;
132}
133
134void phold_stats_collect(phold_state *s, tw_lp *lp, char *buffer)
135{
136 (void) s;
137 (void) lp;
138 (void) buffer;
139 return;
140}
141
144 0,
146 sizeof(int),
147 NULL, //(sample_event_f)
148 NULL, //(sample_revent_f)
149 0},
150 {0}
151};
152
154{
155 TWOPT_GROUP("PHOLD Model"),
156 TWOPT_DOUBLE("remote", percent_remote, "desired remote event rate"),
157 TWOPT_UINT("nlp", nlp_per_pe, "number of LPs per processor"),
158 TWOPT_DOUBLE("mean", mean, "exponential distribution mean for timestamps"),
159 TWOPT_DOUBLE("mult", mult, "multiplier for event memory allocation"),
160 TWOPT_DOUBLE("lookahead", lookahead, "lookahead for events"),
161 TWOPT_UINT("start-events", g_phold_start_events, "number of initial messages per LP"),
162 TWOPT_UINT("stagger", stagger, "Set to 1 to stagger event uniformly across 0 to end time."),
163 TWOPT_UINT("memory", optimistic_memory, "additional memory buffers"),
164 TWOPT_CHAR("run", run_id, "user supplied run name"),
165 TWOPT_END()
166};
167
168/* Definitions to help debug the reversible handler */
172
173void save_state(struct phold_state_checkpoint * into, struct phold_state const * from) {
174 into->saved_dummy_data = from->dummy_state;
175}
176
178 (void) into;
179 // Nothing to do
180}
181
182void print_state(FILE * out, char const * prefix, struct phold_state * state) {
183 fprintf(out, "%sstruct phold_state {\n dummy_state = %ld\n}\n", prefix, state->dummy_state);
184}
185
186void print_state_saved(FILE * out, char const * prefix, struct phold_state_checkpoint * state) {
187 fprintf(out, "%sstruct phold_state_checkpoint {\n saved_dummy_data = %ld\n}\n", prefix, state->saved_dummy_data);
188}
189
190void print_event(FILE * out, char const * prefix, struct phold_state * state, struct phold_message * message) {
191 (void) state;
192 fprintf(out, "%sstruct phold_message {\n dummy_data = %ld\n}\n", prefix, message->dummy_data);
193}
194
195bool check_state(struct phold_state * before, struct phold_state * after) {
196 return before->dummy_state == after->dummy_state;
197}
198/* End of definitions */
199
200int
201main(int argc, char **argv)
202{
203
204#ifdef TEST_COMM_ROSS
205 // Init outside of ROSS
206 MPI_Init(&argc, &argv);
207 // Split COMM_WORLD in half even/odd
208 int mpi_rank;
209 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
210 MPI_Comm split_comm;
211 MPI_Comm_split(MPI_COMM_WORLD, mpi_rank%2, mpi_rank, &split_comm);
212 if(mpi_rank%2 == 1){
213 // tests should catch any MPI_COMM_WORLD collectives
214 MPI_Finalize();
215 return 0;
216 }
217 // Allows ROSS to function as normal
218 tw_comm_set(split_comm);
219#endif
220
221 unsigned int i;
222
223 // set a min lookahead of 1.0
224 lookahead = 1.0;
226 tw_init(&argc, &argv);
227
228#ifdef USE_DAMARIS
229 if(g_st_ross_rank)
230 { // only ross ranks should run code between here and tw_run()
231#endif
232 if( lookahead > 1.0 )
233 tw_error(TW_LOC, "Lookahead > 1.0 .. needs to be less\n");
234
235 //reset mean based on lookahead
236 mean = mean - lookahead;
237
242 //g_tw_rng_default = TW_FALSE;
244
246
247 for(i = 0; i < g_tw_nlp; i++)
248 {
249 tw_lp_settype(i, &mylps[0]);
251 }
252
253 // Defining all functions for checkpointer (used to test proper
254 // implementation of event reversing handler).
255 // This serves as documentation for them.
256 crv_checkpointer phold_chkptr = {
257 .lptype = &mylps[0],
258 .sz_storage = sizeof(struct phold_state_checkpoint),
259 .save_lp = (save_checkpoint_state_f) save_state, // Can be null
260 .clean_lp = (clean_checkpoint_state_f) clean_state, // Can be null
261 .check_lps = (check_states_f) check_state, // Can be null
262 .print_lp = (print_lpstate_f) print_state,
263 .print_checkpoint = (print_checkpoint_state_f) print_state_saved,
264 .print_event = (print_event_f) print_event,
265 };
266 crv_add_custom_state_checkpoint(&phold_chkptr);
267
268 if( g_tw_mynode == 0 )
269 {
270 printf("========================================\n");
271 printf("PHOLD Model Configuration..............\n");
272 printf(" Lookahead..............%lf\n", lookahead);
273 printf(" Start-events...........%u\n", g_phold_start_events);
274 printf(" stagger................%u\n", stagger);
275 printf(" Mean...................%lf\n", mean);
276 printf(" Mult...................%lf\n", mult);
277 printf(" Memory.................%u\n", optimistic_memory);
278 printf(" Remote.................%lf\n", percent_remote);
279 printf("========================================\n\n");
280 }
281
282 tw_run();
283#ifdef USE_DAMARIS
284 } // end if(g_st_ross_rank)
285#endif
286 tw_end();
287
288#ifdef TEST_COMM_ROSS
289 MPI_Finalize();
290#endif
291
292 return 0;
293}
void(* clean_checkpoint_state_f)(void *state)
Definition crv-state.h:9
void(* print_checkpoint_state_f)(FILE *, char const *prefix, void *state)
Definition crv-state.h:12
bool(* check_states_f)(void *current_state, void const *before_state)
Definition crv-state.h:10
void crv_add_custom_state_checkpoint(crv_checkpointer *)
Definition crv-state.c:14
void(* print_lpstate_f)(FILE *, char const *prefix, void *state)
Definition crv-state.h:11
void(* save_checkpoint_state_f)(void *into, void const *from)
Definition crv-state.h:8
void(* print_event_f)(FILE *, char const *prefix, void *lp_state, void *event_msg)
Definition crv-state.h:13
void st_model_settype(tw_lpid i, st_model_types *model_types)
void(* ev_trace_f)(void *msg, tw_lp *lp, char *buffer, int *collect_flag)
void(* model_stat_f)(void *sv, tw_lp *lp, char *buffer)
unsigned tw_nnodes(void)
void tw_comm_set(MPI_Comm comm)
Setup the MPI_COMM_ROSS communicator to use instead of MPI_COMM_WORLD.
Definition network-mpi.c:59
unsigned long tw_peid
Definition ross-base.h:36
double tw_stime
Definition ross-base.h:39
uint64_t tw_lpid
Definition ross-base.h:49
unsigned int g_tw_events_per_pe
Definition ross-global.c:80
void tw_lp_settype(tw_lpid lp, tw_lptype *type)
Definition tw-lp.c:38
void tw_error(const char *file, int line, const char *fmt,...)
Definition tw-util.c:77
void tw_run(void)
Definition tw-setup.c:391
void tw_init(int *argc, char ***argv)
Definition tw-setup.c:53
tw_peid g_tw_mynode
Definition ross-global.c:92
tw_lpid g_tw_nlp
Definition ross-global.c:24
void tw_end(void)
Definition tw-setup.c:476
void tw_event_send(tw_event *event)
Definition tw-event.c:15
void tw_define_lps(tw_lpid nlp, size_t msg_sz)
Definition tw-setup.c:264
double g_tw_lookahead
Definition ross-global.c:53
double g_tw_ts_end
Definition ross-global.c:72
#define TW_LOC
static tw_event * tw_event_new(tw_lpid dest_gid, tw_stime offset_ts, tw_lp *sender)
#define tw_rand_unif(G)
long tw_rand_integer(tw_rng_stream *g, long low, long high)
#define tw_rand_reverse_unif(G)
double tw_rand_exponential(tw_rng_stream *g, double Lambda)
void(* final_f)(void *sv, tw_lp *me)
Definition ross-types.h:90
void(* init_f)(void *sv, tw_lp *me)
Definition ross-types.h:82
void(* event_f)(void *sv, tw_bf *cv, void *msg, tw_lp *me)
Definition ross-types.h:87
void(* revent_f)(void *sv, tw_bf *cv, void *msg, tw_lp *me)
Definition ross-types.h:88
tw_peid(* map_f)(tw_lpid)
Definition ross-types.h:83
void(* commit_f)(void *sv, tw_bf *cv, void *msg, tw_lp *me)
Definition ross-types.h:89
void(* pre_run_f)(void *sv, tw_lp *me)
Definition ross-types.h:86
#define TWOPT_UINT(n, v, h)
Definition tw-opts.h:33
#define TWOPT_GROUP(h)
Definition tw-opts.h:30
#define TWOPT_END()
Definition tw-opts.h:39
#define TWOPT_CHAR(n, v, h)
Definition tw-opts.h:36
void tw_opt_add(const tw_optdef *options)
Definition tw-opts.c:23
#define TWOPT_DOUBLE(n, v, h)
Definition tw-opts.h:35
static void print_event(crv_checkpointer const *chkptr, tw_lp *clp, tw_event *cev)
Definition crv-state.c:88
tw_lptype mylps[]
void phold_finish(phold_state *s, tw_lp *lp)
void phold_commit(phold_state *s, tw_bf *bf, phold_message *m, tw_lp *lp)
void phold_init(phold_state *s, tw_lp *lp)
void phold_event_handler(phold_state *s, tw_bf *bf, phold_message *m, tw_lp *lp)
void phold_event_handler_rc(phold_state *s, tw_bf *bf, phold_message *m, tw_lp *lp)
tw_peid phold_map(tw_lpid gid)
const tw_optdef app_opt[]
static tw_stime percent_remote
Definition phold.h:30
static int optimistic_memory
Definition phold.h:34
static tw_stime mult
Definition phold.h:29
static unsigned int stagger
Definition phold.h:27
static char run_id[1024]
Definition phold.h:39
static unsigned int nlp_per_pe
Definition phold.h:32
static unsigned int offset_lpid
Definition phold.h:28
static int g_phold_start_events
Definition phold.h:33
tw_stime lookahead
Definition phold.h:26
static unsigned int ttl_lps
Definition phold.h:31
static tw_stime mean
Definition phold.h:37
void phold_pre_run(phold_state *s, tw_lp *lp)
Definition phold.main.c:39
bool check_state(struct phold_state *before, struct phold_state *after)
Definition phold.main.c:195
void phold_finish(phold_state *s, tw_lp *lp)
Definition phold.main.c:106
int main(int argc, char **argv)
Definition phold.main.c:201
void clean_state(struct phold_state_checkpoint *into)
Definition phold.main.c:177
void save_state(struct phold_state_checkpoint *into, struct phold_state const *from)
Definition phold.main.c:173
void phold_commit(phold_state *s, tw_bf *bf, phold_message *m, tw_lp *lp)
Definition phold.main.c:97
void print_state_saved(FILE *out, char const *prefix, struct phold_state_checkpoint *state)
Definition phold.main.c:186
void phold_init(phold_state *s, tw_lp *lp)
Definition phold.main.c:11
void phold_event_handler(phold_state *s, tw_bf *bf, phold_message *m, tw_lp *lp)
Definition phold.main.c:59
void event_trace(phold_message *m, tw_lp *lp, char *buffer, int *collect_flag)
Definition phold.main.c:125
void phold_event_handler_rc(phold_state *s, tw_bf *bf, phold_message *m, tw_lp *lp)
Definition phold.main.c:86
void print_event(FILE *out, char const *prefix, struct phold_state *state, struct phold_message *message)
Definition phold.main.c:190
void print_state(FILE *out, char const *prefix, struct phold_state *state)
Definition phold.main.c:182
st_model_types model_types[]
Definition phold.main.c:142
void phold_stats_collect(phold_state *s, tw_lp *lp, char *buffer)
Definition phold.main.c:134
tw_peid phold_map(tw_lpid gid)
Definition phold.main.c:5
long int dummy_data
Definition phold.h:20
long int dummy_state
Definition phold.h:15
Reverse Computation Bitfield.
Definition ross-types.h:188
unsigned int c1
Definition ross-types.h:190
LP State Structure.
Definition ross-types.h:336
tw_rng_stream * rng
RNG stream array for this LP.
Definition ross-types.h:349
tw_lpid gid
global LP id
Definition ross-types.h:338
Function Pointers for ROSS Event Handlers.
Definition ross-types.h:97