summaryrefslogtreecommitdiff
path: root/rts/parallel/ParallelRts.h
blob: d421296d190d1ca48a5606018aa5dd85a8ce89c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
/* --------------------------------------------------------------------------
   Time-stamp: <Tue Mar 06 2001 00:25:50 Stardate: [-30]6285.08 hwloidl>

   Variables and functions specific to the parallel RTS (i.e. GUM or GranSim)
   ----------------------------------------------------------------------- */

#ifndef PARALLEL_RTS_H
#define PARALLEL_RTS_H

#include "ParTicky.h"

/* HWL HACK: compile time sanity checks; shouldn't be necessary at all */
#if defined(PAR) && defined(GRAN)
# error "Both PAR and GRAN defined"
#endif

#if defined(DEBUG)
/* Paranoia debugging: we add an end-of-buffer marker to every pack buffer 
                       (only when sanity checking RTS is enabled, of course) */
#define  DEBUG_HEADROOM        1
#define  END_OF_BUFFER_MARKER  0x1111bbbb
#define  GARBAGE_MARKER        0x1111eeee
#else
#define  DEBUG_HEADROOM        0
#endif /* DEBUG */

#if defined(GRAN) || defined(PAR)

#if defined(GRAN)

/* Statistics info */
extern nat tot_packets, tot_packet_size, tot_cuts, tot_thunks;

/* Pack.c */
rtsPackBuffer *PackNearbyGraph(StgClosure* closure, StgTSO* tso, 
			       nat *packBufferSize, GlobalTaskId dest); 
rtsPackBuffer *PackOneNode(StgClosure* closure, StgTSO* tso, 
			   nat *packBufferSize);
rtsPackBuffer *PackTSO(StgTSO *tso, nat *packBufferSize);
rtsPackBuffer *PackStkO(StgPtr stko, nat *packBufferSize);
void           PackFetchMe(StgClosure *closure);

/* Unpack.c */
StgClosure*    UnpackGraph(rtsPackBuffer* buffer);
void           InitPendingGABuffer(nat size); 

/* RBH.c */
StgClosure    *convertToRBH(StgClosure *closure);
void           convertFromRBH(StgClosure *closure);

/* HLComms.c */
rtsFetchReturnCode blockFetch(StgTSO* tso, PEs proc, StgClosure* bh);
void               blockThread(StgTSO *tso);

#endif
#if defined(PAR)

/* Statistics info */

/* global structure for collecting statistics */
typedef struct GlobalParStats_ {
  /* GALA and LAGA table info */
  nat tot_mark_GA, tot_rebuild_GA, tot_free_GA,
      res_mark_GA, res_rebuild_GA, res_free_GA,
      cnt_mark_GA, cnt_rebuild_GA, cnt_free_GA,
      res_size_GA, tot_size_GA, local_alloc_GA, tot_global, tot_local;

  /* time spent managing the GAs */
  double time_mark_GA, time_rebuild_GA;

  /* spark queue stats */
  nat res_sp, tot_sp, cnt_sp, emp_sp;
  // nat tot_sq_len, tot_sq_probes, tot_sparks;
  /* thread queue stats */
  nat res_tp, tot_tp, cnt_tp, emp_tp;
  //nat tot_add_threads, tot_tq_len, non_end_add_threads;

  /* packet statistics */
  nat tot_packets, tot_packet_size, tot_thunks,
      res_packet_size, res_thunks,
      rec_packets, rec_packet_size, rec_thunks,
      rec_res_packet_size, rec_res_thunks;
  /* time spent packing stuff */
  double time_pack, time_unpack;

  /* thread stats */
  nat tot_threads_created;

  /* spark stats */
  //nat pruned_sparks, withered_sparks;
  nat tot_sparks_created, tot_sparks_ignored, tot_sparks_marked,
      res_sparks_created, res_sparks_ignored, res_sparks_marked; // , sparks_created_on_PE[MAX_PROC];
  double time_sparks;

  /* scheduling stats */
  nat tot_yields, tot_stackover, tot_heapover;

  /* message statistics */
  nat tot_fish_mess, tot_fetch_mess, tot_resume_mess, tot_schedule_mess;
  nat rec_fish_mess, rec_fetch_mess, rec_resume_mess, rec_schedule_mess;
#if defined(DIST)
  nat tot_reval_mess;
  nat rec_reval_mess;
#endif

  /* blocking queue statistics
  rtsTime tot_bq_processing_time;
  nat tot_bq_len, tot_bq_len_local, tot_awbq, tot_FMBQs;
  */

  /* specialised info on arrays (for GPH/Maple mainly) */
  nat tot_arrs, tot_arr_size;
} GlobalParStats;

extern GlobalParStats globalParStats;

void  globalParStat_exit(void);

/* Pack.c */
rtsBool        InitPackBuffer(void);
rtsPackBuffer *PackNearbyGraph(StgClosure* closure, StgTSO* tso, 
			       nat *packBufferSize, GlobalTaskId dest); 

/* Unpack.c */
void           CommonUp(StgClosure *src, StgClosure *dst);
StgClosure    *UnpackGraph(rtsPackBuffer *buffer, globalAddr **gamap, 
			   nat *nGAs);

/* RBH.c */
StgClosure    *convertToRBH(StgClosure *closure);
void           convertToFetchMe(StgRBH *rbh, globalAddr *ga);

/* HLComms.c */
void           blockFetch(StgBlockedFetch *bf, StgClosure *bh);
void           blockThread(StgTSO *tso);

/* Global.c */
void           GALAdeprecate(globalAddr *ga);

/* HLComms.c */
nat            pending_fetches_len(void);

/* ParInit.c */
void 	       initParallelSystem(void);
void 	       shutdownParallelSystem(StgInt n);
void 	       synchroniseSystem(void);
void 	       par_exit(I_);

#endif

/* this routine should be moved to a more general module; currently in Pack.c 
StgInfoTable* get_closure_info(StgClosure* node, 
			       nat *size, nat *ptrs, nat *nonptrs, nat *vhs, 
			       char *info_hdr_ty);
*/
void doGlobalGC(void); 

//@node GC routines, Debugging routines, Spark handling routines
//@subsection GC routines

#if defined(PAR)
/* HLComms.c */
void      freeRemoteGA(int pe, globalAddr *ga);
void      sendFreeMessages(void);
void      markPendingFetches(rtsBool major_gc);

/* Global.c */
void      markLocalGAs(rtsBool full);
void      RebuildGAtables(rtsBool full);
void      RebuildLAGAtable(void);
#endif

//@node Debugging routines, Generating .gr profiles, GC routines
//@subsection Debugging routines

#if defined(PAR)
void      printGA (globalAddr *ga);
void      printGALA (GALA *gala);
void      printLAGAtable(void);

rtsBool   isOnLiveIndTable(globalAddr *ga);
rtsBool   isOnRemoteGATable(globalAddr *ga);
void      checkFreeGALAList(void);
void      checkFreeIndirectionsList(void);
#endif

//@node Generating .gr profiles, Index, Debugging routines
//@subsection Generating .gr profiles

#define STATS_FILENAME_MAXLEN	128

/* Where to write the log file */
//@cindex gr_file
//@cindex gr_filename
extern FILE *gr_file;
extern char gr_filename[STATS_FILENAME_MAXLEN];

//@cindex init_gr_stats
//@cindex init_gr_simulation
//@cindex end_gr_simulation
void 	  	init_gr_stats (void);
void 	  	init_gr_simulation(int rts_argc, char *rts_argv[], 
 	 			   int prog_argc, char *prog_argv[]);
void 	  	end_gr_simulation(void);

// TODO: move fcts in here (as static inline)
StgInfoTable*   get_closure_info(StgClosure* node, nat *size, nat *ptrs, nat *nonptrs, nat *vhs, char *info_hdr_ty);
rtsBool         IS_BLACK_HOLE(StgClosure* node);
StgClosure     *IS_INDIRECTION(StgClosure* node)          ;
StgClosure     *UNWIND_IND (StgClosure *closure);


#endif /* defined(PAR) || defined(GRAN) */

//@node Common macros, Index, Generating .gr profiles
//@subsection Common macros

#define LOOKS_LIKE_PTR(r)    \
        (LOOKS_LIKE_STATIC_CLOSURE(r) ||  \
         ((HEAP_ALLOCED(r) && Bdescr((P_)r)->free != (void *)-1)))

/* see Sanity.c for this kind of test; doing this in these basic fcts
   is paranoid (nuke it after debugging!)
*/

/* pathetic version of the check whether p can be a closure */
#define LOOKS_LIKE_COOL_CLOSURE(p)  1

//LOOKS_LIKE_GHC_INFO(get_itbl(p))

    /* Is it a static closure (i.e. in the data segment)? */ \
    /*
#define LOOKS_LIKE_COOL_CLOSURE(p)  \
    ((LOOKS_LIKE_STATIC(p)) ?                                   \
	closure_STATIC(p)                               \
      : !closure_STATIC(p) && LOOKS_LIKE_PTR(p))
    */

#endif /* PARALLEL_RTS_H */

//@node Index,  , Index
//@subsection Index

//@index
//* IS_BLACK_HOLE::  @cindex\s-+IS_BLACK_HOLE
//* IS_INDIRECTION::  @cindex\s-+IS_INDIRECTION
//* end_gr_simulation::  @cindex\s-+end_gr_simulation
//* get_closure_info::  @cindex\s-+get_closure_info
//* gr_file::  @cindex\s-+gr_file
//* gr_filename::  @cindex\s-+gr_filename
//* init_gr_simulation::  @cindex\s-+init_gr_simulation
//* unwindInd::  @cindex\s-+unwindInd
//@end index