ROSS
ross-inline.h
Go to the documentation of this file.
1#ifndef INC_ross_inline_h
2#define INC_ross_inline_h
3
4#include "ross-types.h"
5#include "tw-eventq.h"
6#ifdef USE_RIO
7#include "rio/io.h"
8#endif
9
10static inline tw_event *
12{
13 tw_event *e = tw_eventq_pop(&pe->free_q);
14
15 if (e)
16 {
17 e->cancel_next = NULL;
18 e->caused_by_me = NULL;
19 e->cause_next = NULL;
20 e->prev = e->next = NULL;
21
22 memset(&e->state, 0, sizeof(e->state));
23 memset(&e->event_id, 0, sizeof(e->event_id));
24 }
25 return e;
26}
27
28static inline void
29tw_free_output_messages(tw_event *e, int print_message)
30{
31 while (e->out_msgs) {
32 tw_out *temp = e->out_msgs;
33 if (print_message)
34 printf("%s", temp->message);
35 e->out_msgs = temp->next;
36 // Put it back
38 }
39}
40
41/**
42 * Creates an event with a given priority in range [0,1], lower value is higher priority
43 *
44 * @bug There's a bug in this function. We put dest_gid, which is
45 * a 64-bit value, into dest_lp which may be a 32-bit pointer.
46 */
47static inline tw_event *
48tw_event_new_user_prio(tw_lpid dest_gid, tw_stime offset_ts, tw_lp * sender, tw_stime prio)
49{
50 tw_pe *send_pe;
51 tw_event *e;
52 tw_stime recv_ts;
53
54 if (TW_STIME_DBL(offset_ts) < 0.0) {
55 tw_error(TW_LOC, "Cannot send events into the past! Sending LP: %lu\n", sender->gid);
56 }
57
58 if (TW_STIME_DBL(prio) < 0.0 || TW_STIME_DBL(prio) > 1.0) {
59 tw_error(TW_LOC, "Cannot specify an event priority outside of range [0.0,1.0]");
60 }
61
62 send_pe = sender->pe;
63 recv_ts = TW_STIME_ADD(tw_now(sender), offset_ts);
64
66 {
67 /* keep track of the smallest timestamp offset we have seen */
70 }
71
72 /* If this event will be past the end time, or there
73 * are no more free events available, use abort event.
74 */
75 if (TW_STIME_DBL(recv_ts) >= g_tw_ts_end) {
76#ifdef USE_RIO
77 e = io_event_grab(send_pe);
78#else
79 e = send_pe->abort_event;
80#endif
81 send_pe->stats.s_events_past_end++;
82 } else {
83 e = tw_event_grab(send_pe);
84 if (!e) {
88 "No free event buffers. Try increasing via g_tw_events_per_pe"
89 " or --extramem");
90 }
91 else
92 e = send_pe->abort_event;
93 }
94 }
95
96 e->send_pe = sender->pe->id;
97 e->dest_lp = (tw_lp *) dest_gid;
98 e->dest_lpid = dest_gid;
99 e->src_lp = sender;
100 e->recv_ts = recv_ts;
101 e->send_ts = tw_now(sender);
102 e->critical_path = sender->critical_path + 1;
103
104
105#ifdef USE_RAND_TIEBREAKER
106 e->aborted_total = 0;
107 e->sig.priority = prio;
108 tw_event *now_event = send_pe->cur_event; // Finding event currently being processed, and thus the event that triggered this event
109 tw_stime u_rand_val = tw_rand_unif(sender->core_rng); //create a random number used to deterministically break event ties, this is rolled back in tw_event_rollback() during the sender LP cancel loop
110 e->sig.recv_ts = recv_ts;
111 if (offset_ts == 0) {
112 if (now_event->sig.tie_lineage_length >= MAX_TIE_CHAIN)
113 tw_error(TW_LOC, "Maximum zero-offset tie chain reached (%d), increase #define in ross-types.h",MAX_TIE_CHAIN);
114 memcpy(e->sig.event_tiebreaker, now_event->sig.event_tiebreaker, sizeof(tw_stime)*(now_event->sig.tie_lineage_length));
115 e->sig.event_tiebreaker[now_event->sig.tie_lineage_length] = u_rand_val;
116 e->sig.tie_lineage_length = now_event->sig.tie_lineage_length + 1;
117 }
118 else {
119 e->sig.event_tiebreaker[0] = u_rand_val;
120 e->sig.tie_lineage_length = 1;
121 }
122#endif
123
125
126 return e;
127}
128
129/**
130 * @bug There's a bug in this function. We put dest_gid, which is
131 * a 64-bit value, into dest_lp which may be a 32-bit pointer.
132 */
133static inline tw_event *
134tw_event_new(tw_lpid dest_gid, tw_stime offset_ts, tw_lp * sender)
135{
136 return tw_event_new_user_prio(dest_gid, offset_ts, sender, 1);
137}
138
139
140static inline void
142{
143 /*
144 * During the course of a rollback, events are supposed to put
145 * the membufs back on the event. The event is then cancelled
146 * and freed -- which is how a membuf could end up on a freed
147 * event.
148 */
150
151 if (e->delta_buddy) {
152 tw_clock start = tw_clock_read();
154 g_tw_pe->stats.s_buddy += (tw_clock_read() - start);
155 e->delta_buddy = 0;
156 }
157
159
160 tw_eventq_unshift(&pe->free_q, e);
161}
162
163static inline void *
165{
166 return event + 1;
167}
168
169#endif
tw_pe * pe
Definition avl_tree.c:10
void buddy_free(void *ptr)
Definition buddy.c:137
static tw_clock tw_clock_read(void)
Definition aarch64.h:8
uint64_t tw_clock
Definition aarch64.h:6
tw_event * io_event_grab(tw_pe *pe)
Definition io-mpi.c:42
#define TW_STIME_DBL(x)
Definition ross-base.h:42
#define TW_STIME_ADD(x, y)
Definition ross-base.h:44
double tw_stime
Definition ross-base.h:39
uint64_t tw_lpid
Definition ross-base.h:49
double g_tw_min_detected_offset
Definition ross-global.c:59
tw_pe * g_tw_pe
Definition ross-global.c:79
void tw_error(const char *file, int line, const char *fmt,...)
Definition tw-util.c:77
void tw_kp_put_back_output_buffer(tw_out *out)
Definition tw-kp.c:223
tw_synch g_tw_synchronization_protocol
Definition ross-global.c:19
double g_tw_ts_end
Definition ross-global.c:72
#define TW_LOC
static void * tw_event_data(tw_event *event)
static void tw_free_output_messages(tw_event *e, int print_message)
Definition ross-inline.h:29
static tw_event * tw_event_grab(tw_pe *pe)
Definition ross-inline.h:11
static tw_event * tw_event_new(tw_lpid dest_gid, tw_stime offset_ts, tw_lp *sender)
static tw_event * tw_event_new_user_prio(tw_lpid dest_gid, tw_stime offset_ts, tw_lp *sender, tw_stime prio)
Definition ross-inline.h:48
static void tw_event_free(tw_pe *pe, tw_event *e)
static tw_stime tw_now(tw_lp const *lp)
#define tw_rand_unif(G)
#define MAX_TIE_CHAIN
Definition ross-types.h:30
@ SEQUENTIAL
Definition ross-types.h:37
@ CONSERVATIVE
Definition ross-types.h:38
@ TW_pe_free_q
In tw_pe.free_q.
Definition ross-types.h:232
static void tw_eventq_unshift(tw_eventq *q, tw_event *e)
Definition tw-eventq.h:344
static tw_event * tw_eventq_pop(tw_eventq *q)
Definition tw-eventq.h:313
Definition of ROSS basic types.
double event_tiebreaker[20]
Definition ross-types.h:263
double priority
Definition ross-types.h:261
tw_stime recv_ts
Definition ross-types.h:260
unsigned int tie_lineage_length
Definition ross-types.h:262
Event Stucture.
Definition ross-types.h:277
struct tw_event::@130070134144252114152124341363102114315067064025 state
tw_event * cause_next
Next in parent's caused_by_me chain.
Definition ross-types.h:289
tw_lp * src_lp
Sending LP ID.
Definition ross-types.h:313
tw_out * out_msgs
Output messages.
Definition ross-types.h:321
tw_stime recv_ts
Actual time to be received.
Definition ross-types.h:314
unsigned int critical_path
Critical path of this event.
Definition ross-types.h:310
tw_lpid dest_lpid
Definition ross-types.h:318
unsigned char owner
Owner of the next/prev pointers; see tw_event_owner.
Definition ross-types.h:300
void * delta_buddy
Delta memory from buddy allocator.
Definition ross-types.h:307
tw_stime send_ts
Definition ross-types.h:319
tw_event * caused_by_me
Start of event list caused by this event.
Definition ross-types.h:288
tw_event * next
Definition ross-types.h:278
tw_lp * dest_lp
Destination LP ID.
Definition ross-types.h:312
tw_event * prev
Definition ross-types.h:279
tw_eventid event_id
Unique id assigned by src_lp->pe if remote.
Definition ross-types.h:291
tw_peid send_pe
Definition ross-types.h:316
tw_event * cancel_next
Next event in the cancel queue for the dest_pe.
Definition ross-types.h:287
tw_event_sig sig
Event signature, to be used by tiebreaker.
Definition ross-types.h:294
size_t aborted_total
Number of events caused by this event that were not scheduled.
Definition ross-types.h:295
LP State Structure.
Definition ross-types.h:336
tw_pe * pe
Definition ross-types.h:340
tw_lpid gid
global LP id
Definition ross-types.h:338
tw_rng_stream * core_rng
RNG stream array for ROSS non-model operation - possible alternative to a model_rng pointer array.
Definition ross-types.h:350
unsigned int critical_path
Critical path value for this LP.
Definition ross-types.h:352
Rollback-aware output mechanism.
Definition ross-types.h:246
struct tw_out * next
Definition ross-types.h:247
char message[256 - 2 *sizeof(void *)]
Definition ross-types.h:250
Holds the entire PE state.
Definition ross-types.h:416
tw_peid id
Definition ross-types.h:417
tw_event * cur_event
Current event being processed.
Definition ross-types.h:426
tw_event * abort_event
Placeholder event for when free_q is empty.
Definition ross-types.h:425
tw_statistics stats
per PE counters
Definition ross-types.h:463
tw_stat s_events_past_end
Definition ross-types.h:164