ROSS
phold-gvt-hook.main.c
Go to the documentation of this file.
1#include "phold.h"
2
3tw_peid phold_map(tw_lpid gid) { return (tw_peid)gid / g_tw_nlp; }
4
6 (void)s;
7
8 tw_stime stagger_offset = 0.0;
9 if (stagger) {
10 stagger_offset = lp->gid % (unsigned int)g_tw_ts_end;
11 }
12 for (int i = 0; i < g_phold_start_events; i++) {
14 lp->gid,
15 tw_rand_exponential(lp->rng, mean) + lookahead + stagger_offset, lp));
16 }
17}
18
20 (void)s;
21 tw_lpid dest;
22
23 if (tw_rand_unif(lp->rng) <= percent_remote) {
24 dest = tw_rand_integer(lp->rng, 0, ttl_lps - 1);
25 } else {
26 dest = lp->gid;
27 }
28
29 if (dest >= (g_tw_nlp * tw_nnodes())) {
30 tw_error(TW_LOC, "bad dest");
31 }
32
35}
36
38 tw_lp *lp) {
39 (void)s;
40 (void)m;
41 bf->c1 = 0;
42 bf->c2 = 0;
43 tw_lpid dest = lp->gid;
44
45 if (tw_rand_unif(lp->rng) <= percent_remote) {
46 bf->c1 = 1;
47 dest = tw_rand_integer(lp->rng, 0, ttl_lps - 1);
48 // Makes PHOLD non-deterministic across processors! Don't uncomment
49 /* dest += offset_lpid; */
50 /* if(dest >= ttl_lps) */
51 /* dest -= ttl_lps; */
52 }
53
54 if (dest >= (g_tw_nlp * tw_nnodes())) {
55 tw_error(TW_LOC, "bad dest");
56 }
57
60
61#ifdef TRIGGER_BY_MODEL
62 // trigger GVT hook around every 1000 events
63 int const random_occurence = tw_rand_integer(lp->rng, 0, 1000);
64 if (lp->gid == 0 && random_occurence == 0) {
65 bf->c2 = 1;
67 }
68#endif
69}
70
72 tw_lp *lp) {
73 (void)s;
74 (void)m;
77
78 if (bf->c1) {
80 }
81
82#ifdef TRIGGER_BY_MODEL
84 if (bf->c2) {
86 }
87#endif
88}
89
91 (void)s;
92 (void)bf;
93 (void)m;
94 (void)lp;
95}
96
98 (void)s;
99 (void)lp;
100}
101
104 /* (pre_run_f) phold_pre_run, */
108 {0},
109};
110
111void gvt_hook(tw_pe * pe, bool past_end_time) {
112 (void) past_end_time;
113#ifdef USE_RAND_TIEBREAKER
114 tw_event_sig gvt_sig = pe->GVT_sig;
115 tw_stime gvt = gvt_sig.recv_ts;
116#else
117 tw_stime gvt = pe->GVT;
118#endif
119
120 if (g_tw_mynode == 0) {
121 printf("Current GVT time %f\n", gvt);
122 }
123
124#ifdef TRIGGER_AT_TIMESTAMP
125 static float trigger_at = 1.0; // initial value is 1.0, then 2.0, 4, 8, 16, ...
126 trigger_at *= 2;
127 tw_trigger_gvt_hook_at(trigger_at);
128#endif
129}
130
132 TWOPT_GROUP("PHOLD Model"),
133 TWOPT_DOUBLE("remote", percent_remote, "desired remote event rate"),
134 TWOPT_UINT("nlp", nlp_per_pe, "number of LPs per processor"),
135 TWOPT_DOUBLE("mean", mean, "exponential distribution mean for timestamps"),
136 TWOPT_DOUBLE("mult", mult, "multiplier for event memory allocation"),
137 TWOPT_DOUBLE("lookahead", lookahead, "lookahead for events"),
138 TWOPT_UINT("start-events", g_phold_start_events,
139 "number of initial messages per LP"),
140 TWOPT_UINT("stagger", stagger,
141 "Set to 1 to stagger event uniformly across 0 to end time."),
142 TWOPT_UINT("memory", optimistic_memory, "additional memory buffers"),
143 TWOPT_CHAR("run", run_id, "user supplied run name"),
144 TWOPT_END()};
145
146int main(int argc, char **argv) {
147#ifdef TEST_COMM_ROSS
148 // Init outside of ROSS
149 MPI_Init(&argc, &argv);
150 // Split COMM_WORLD in half even/odd
151 int mpi_rank;
152 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
153 MPI_Comm split_comm;
154 MPI_Comm_split(MPI_COMM_WORLD, mpi_rank % 2, mpi_rank, &split_comm);
155 if (mpi_rank % 2 == 1) {
156 // tests should catch any MPI_COMM_WORLD collectives
157 MPI_Finalize();
158 return 0;
159 }
160 // Allows ROSS to function as normal
161 tw_comm_set(split_comm);
162#endif
163
164 // set a min lookahead of 1.0
165 lookahead = 1.0;
167 tw_init(&argc, &argv);
168
169 if (lookahead > 1.0) {
170 tw_error(TW_LOC, "Lookahead > 1.0 .. needs to be less\n");
171 }
172
173 // setting up GVT hook
175#ifdef TRIGGER_BY_MODEL
177#else
178#ifdef TRIGGER_AT_TIMESTAMP
180#else // by default, the GVT function is called every 500 GVT operations
182#endif
183#endif
184
185 // reset mean based on lookahead
186 mean = mean - lookahead;
187
192 // g_tw_rng_default = TW_FALSE;
194
196
197 for (unsigned int i = 0; i < g_tw_nlp; i++) {
198 tw_lp_settype(i, &mylps[0]);
199 }
200
201 if (g_tw_mynode == 0) {
202 printf("========================================\n");
203 printf("PHOLD Model Configuration..............\n");
204 printf(" Lookahead..............%lf\n", lookahead);
205 printf(" Start-events...........%u\n", g_phold_start_events);
206 printf(" stagger................%u\n", stagger);
207 printf(" Mean...................%lf\n", mean);
208 printf(" Mult...................%lf\n", mult);
209 printf(" Memory.................%u\n", optimistic_memory);
210 printf(" Remote.................%lf\n", percent_remote);
211 printf("========================================\n\n");
212 }
213
214 tw_run();
215 tw_end();
216
217#ifdef TEST_COMM_ROSS
218 MPI_Finalize();
219#endif
220
221 return 0;
222}
tw_pe * pe
Definition avl_tree.c:10
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
void tw_trigger_gvt_hook_at(tw_stime time)
void tw_trigger_gvt_hook_every(int num_gvt_calls)
void(* g_tw_gvt_hook)(tw_pe *pe, bool is_queue_empty)
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
void tw_trigger_gvt_hook_now_rev(tw_lp *lp)
void tw_trigger_gvt_hook_now(tw_lp *lp)
void tw_trigger_gvt_hook_when_model_calls(void)
tw_lptype mylps[]
void phold_pre_run(phold_state *s, tw_lp *lp)
void phold_finish(phold_state *s, tw_lp *lp)
int main(int argc, char **argv)
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)
void gvt_hook(tw_pe *pe, bool past_end_time)
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
Reverse Computation Bitfield.
Definition ross-types.h:188
unsigned int c1
Definition ross-types.h:190
unsigned int c2
Definition ross-types.h:191
tw_stime recv_ts
Definition ross-types.h:260
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
Holds the entire PE state.
Definition ross-types.h:416