X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fparallel%2FParallelRts.h;fp=rts%2Fparallel%2FParallelRts.h;h=d421296d190d1ca48a5606018aa5dd85a8ce89c4;hb=0065d5ab628975892cea1ec7303f968c3338cbe1;hp=0000000000000000000000000000000000000000;hpb=28a464a75e14cece5db40f2765a29348273ff2d2;p=ghc-hetmet.git diff --git a/rts/parallel/ParallelRts.h b/rts/parallel/ParallelRts.h new file mode 100644 index 0000000..d421296 --- /dev/null +++ b/rts/parallel/ParallelRts.h @@ -0,0 +1,253 @@ +/* -------------------------------------------------------------------------- + Time-stamp: + + 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