X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=includes%2FParallel.h;fp=includes%2FParallel.h;h=e18fbe9b2c592f894969c95d46477d6bbc4fc2e9;hb=0065d5ab628975892cea1ec7303f968c3338cbe1;hp=0000000000000000000000000000000000000000;hpb=28a464a75e14cece5db40f2765a29348273ff2d2;p=ghc-hetmet.git diff --git a/includes/Parallel.h b/includes/Parallel.h new file mode 100644 index 0000000..e18fbe9 --- /dev/null +++ b/includes/Parallel.h @@ -0,0 +1,360 @@ +/* + Definitions for GUM i.e. running on a parallel machine. + + This section contains definitions applicable only to programs compiled + to run on a parallel machine, i.e. on GUM. Some of these definitions + are also used when simulating parallel execution, i.e. on GranSim. +*/ + +#ifndef PARALLEL_H +#define PARALLEL_H + +#if defined(PAR) || defined(GRAN) /* whole file */ + +/* + * @node Parallel definitions, End of File + * @section Parallel definitions + * + * @menu + * * Basic definitions:: + * * GUM:: + * * GranSim:: + * @end menu + * + * @node Basic definitions, GUM, Parallel definitions, Parallel definitions + * @subsection Basic definitions + */ + +/* This clashes with TICKY, but currently TICKY and PAR hate each other anyway */ +#define _HS sizeofW(StgHeader) + +/* SET_PAR_HDR and SET_STATIC_PAR_HDR now live in ClosureMacros.h */ + +/* Needed for dumping routines */ +#if defined(PAR) +# define NODE_STR_LEN 20 +# define TIME_STR_LEN 120 +# define TIME rtsTime +# define CURRENT_TIME (msTime() - startTime) +# define TIME_ON_PROC(p) (msTime() - startTime) +# define CURRENT_PROC thisPE +# define BINARY_STATS RtsFlags.ParFlags.ParStats.Binary +#elif defined(GRAN) +# define NODE_STR_LEN 20 +# define TIME_STR_LEN 120 +# define TIME rtsTime +# define CURRENT_TIME CurrentTime[CurrentProc] +# define TIME_ON_PROC(p) CurrentTime[p] +# define CURRENT_PROC CurrentProc +# define BINARY_STATS RtsFlags.GranFlags.GranSimStats.Binary +#endif + +#if defined(PAR) +# define MAX_PES 256 /* Maximum number of processors */ + /* MAX_PES is enforced by SysMan, which does not + allow more than this many "processors". + This is important because PackGA [GlobAddr.lc] + **assumes** that a PE# can fit in 8+ bits. + */ + +# define SPARK_POOLS 2 /* no. of spark pools */ +# define REQUIRED_POOL 0 /* idx of pool of mandatory sparks (concurrency) */ +# define ADVISORY_POOL 1 /* idx of pool of advisory sparks (parallelism) */ +#endif + +/* + * @menu + * * GUM:: + * * GranSim:: + * @end menu + * + * @node GUM, GranSim, Basic definitions, Parallel definitions + * @subsection GUM + */ + +#if defined(PAR) +/* + Symbolic constants for the packing code. + + This constant defines how many words of data we can pack into a single + packet in the parallel (GUM) system. +*/ + +/* + * @menu + * * Types:: + * * Externs:: + * * Prototypes:: + * * Macros:: + * @end menu + * + * @node Types, Externs, GUM, GUM + * @subsubsection Types + */ + +/* Sparks and spark queues */ +typedef StgClosure *rtsSpark; +typedef rtsSpark *rtsSparkQ; + +typedef struct rtsPackBuffer_ { + StgInt /* nat */ id; + StgInt /* nat */ size; + StgInt /* nat */ unpacked_size; + StgTSO *tso; + StgWord *buffer[0]; +} rtsPackBuffer; + +#define PACK_BUFFER_HDR_SIZE 4 + +/* + * @node Externs, Prototypes, Types, GUM + * @subsubsection Externs + */ + +/* extern rtsBool do_sp_profile; */ + +extern globalAddr theGlobalFromGA, theGlobalToGA; +extern StgBlockedFetch *PendingFetches; +extern GlobalTaskId *allPEs; + +extern rtsBool IAmMainThread, GlobalStopPending; +/*extern rtsBool fishing; */ +extern rtsTime last_fish_arrived_at; +extern nat outstandingFishes; +extern GlobalTaskId SysManTask; +extern int seed; /* pseudo-random-number generator seed: */ + /* Initialised in ParInit */ +extern StgInt threadId; /* Number of Threads that have existed on a PE */ +extern GlobalTaskId mytid; + +extern GlobalTaskId *allPEs; +extern nat nPEs; +extern nat sparksIgnored, sparksCreated, threadsIgnored, threadsCreated; +extern nat advisory_thread_count; + +extern rtsBool InGlobalGC; /* Are we in the midst of performing global GC */ + +extern ullong startTime; /* start of comp; in RtsStartup.c */ + +/* the spark pools proper */ +extern rtsSpark *pending_sparks_hd[]; /* ptr to start of a spark pool */ +extern rtsSpark *pending_sparks_tl[]; /* ptr to end of a spark pool */ +extern rtsSpark *pending_sparks_lim[]; +extern rtsSpark *pending_sparks_base[]; +extern nat spark_limit[]; + +extern rtsPackBuffer *PackBuffer; /* size: can be set via option */ +extern rtsPackBuffer *buffer; +extern rtsPackBuffer *freeBuffer; +extern rtsPackBuffer *packBuffer; +extern rtsPackBuffer *gumPackBuffer; + +extern nat thisPE; + +/* From Global.c +extern GALA *freeGALAList; +extern GALA *freeIndirections; +extern GALA *liveIndirections; +extern GALA *liveRemoteGAs; +*/ + +/* + * @node Prototypes, Macros, Externs, GUM + * @subsubsection Prototypes + */ + +/* From ParInit.c */ +void initParallelSystem(void); +void SynchroniseSystem(void); +void par_exit(StgInt n); + +PEs taskIDtoPE (GlobalTaskId gtid); +void registerTask (GlobalTaskId gtid); +globalAddr *LAGAlookup (StgClosure *addr); +StgClosure *GALAlookup (globalAddr *ga); +/*static GALA *allocIndirection (StgPtr addr); */ +globalAddr *makeGlobal (StgClosure *addr, rtsBool preferred); +globalAddr *setRemoteGA (StgClosure *addr, globalAddr *ga, rtsBool preferred); +void splitWeight (globalAddr *to, globalAddr *from); +globalAddr *addWeight (globalAddr *ga); +void initGAtables (void); +void RebuildLAGAtable (void); +StgWord PackGA (StgWord pe, int slot); + +# if defined(DEBUG) +/* from Global.c */ +/* highest_slot breaks the abstraction of the slot counter for GAs; it is + only used for sanity checking and should used nowhere else */ +StgInt highest_slot (void); +# endif + +/* + * @node Macros, , Prototypes, GUM + * @subsubsection Macros + */ + +/* delay (in us) between dying fish returning and sending out a new fish */ +#define FISH_DELAY 1000 +/* max no. of outstanding spark steals */ +#define MAX_FISHES 1 + +/* ToDo: check which of these is actually needed! */ + +# define PACK_HEAP_REQUIRED ((RtsFlags.ParFlags.packBufferSize - PACK_HDR_SIZE) / (PACK_GA_SIZE + _HS) * (MIN_UPD_SIZE + 2)) + +# define MAX_GAS (RtsFlags.ParFlags.packBufferSize / PACK_GA_SIZE) + + +# define PACK_GA_SIZE 3 /* Size of a packed GA in words */ + /* Size of a packed fetch-me in words */ +# define PACK_FETCHME_SIZE (PACK_GA_SIZE + _HS) + +# define PACK_HDR_SIZE 1 /* Words of header in a packet */ + +# define PACK_PLC_SIZE 2 /* Size of a packed PLC in words */ + +/* + Definitions relating to the entire parallel-only fixed-header field. + + On GUM, the global addresses for each local closure are stored in a + separate hash table, rather then with the closure in the heap. We call + @getGA@ to look up the global address associated with a local closure (0 + is returned for local closures that have no global address), and @setGA@ + to store a new global address for a local closure which did not + previously have one. */ + +# define GA_HDR_SIZE 0 + +# define GA(closure) getGA(closure) + +# define SET_GA(closure, ga) setGA(closure,ga) +# define SET_STATIC_GA(closure) +# define SET_GRAN_HDR(closure,pe) +# define SET_STATIC_PROCS(closure) + +# define MAX_GA_WEIGHT 0 /* Treat as 2^n */ + +/* At the moment, there is no activity profiling for GUM. This may change. */ +# define SET_TASK_ACTIVITY(act) /* nothing */ + +/* + The following macros are only needed for sanity checking (see Sanity.c). +*/ + +/* NB: this is PVM specific and should be updated for MPI etc + in PVM a task id (tid) is split into 2 parts: the id for the + physical processor it is running on and an index of tasks running + on a processor; PVM_PE_MASK indicates which part of a tid holds the + id of the physical processor (the other part of the word holds the + index on that processor) + MAX_PVM_PES and MAX_PVM_TIDS are maximal values for these 2 components + in GUM we have an upper bound for the total number of PVM PEs allowed: + it's MAX_PE defined in Parallel.h + to check the slot field of a GA we call a fct highest_slot which just + returns the internal counter +*/ +#define PVM_PE_MASK 0xfffc0000 +#define MAX_PVM_PES MAX_PES +#define MAX_PVM_TIDS MAX_PES + +#if 0 +#define LOOKS_LIKE_TID(tid) (((tid & PVM_PE_MASK) != 0) && \ + (((tid & PVM_PE_MASK) + (tid & ~PVM_PE_MASK)) < MAX_PVM_TIDS)) +#define LOOKS_LIKE_SLOT(slot) (slot<=highest_slot()) + +#define LOOKS_LIKE_GA(ga) (LOOKS_LIKE_TID((ga)->payload.gc.gtid) && \ + LOOKS_LIKE_SLOT((ga)->payload.gc.slot)) +#else +rtsBool looks_like_tid(StgInt tid); +rtsBool looks_like_slot(StgInt slot); +rtsBool looks_like_ga(globalAddr *ga); +#define LOOKS_LIKE_TID(tid) looks_like_tid(tid) +#define LOOKS_LIKE_GA(ga) looks_like_ga(ga) +#endif /* 0 */ + +#endif /* PAR */ + +/* + * @node GranSim, , GUM, Parallel definitions + * @subsection GranSim + */ + +#if defined(GRAN) +/* ToDo: Check which of the PAR routines are needed in GranSim -- HWL */ + +/* + * @menu + * * Types:: + * * Prototypes:: + * * Macros:: + * @end menu + * + * @node Types, Prototypes, GranSim, GranSim + * @subsubsection Types + */ + +typedef StgWord *StgBuffer; +typedef struct rtsPackBuffer_ { + StgInt /* nat */ id; + StgInt /* nat */ size; + StgInt /* nat */ unpacked_size; + StgTSO *tso; + StgWord *buffer; +} rtsPackBuffer; + +/* + * @node Macros, , Prototypes, GranSim + * @subsubsection Macros + */ + +/* max no. of outstanding spark steals */ +#define MAX_FISHES 1 + +/* These are needed in the packing code to get the size of the packet + right. The closures itself are never built in GrAnSim. */ +# define FETCHME_VHS IND_VHS +# define FETCHME_HS IND_HS + +# define FETCHME_GA_LOCN FETCHME_HS + +# define FETCHME_CLOSURE_SIZE(closure) IND_CLOSURE_SIZE(closure) +# define FETCHME_CLOSURE_NoPTRS(closure) 0L +# define FETCHME_CLOSURE_NoNONPTRS(closure) (IND_CLOSURE_SIZE(closure)-IND_VHS) + +# define MAX_GAS (RtsFlags.GranFlags.packBufferSize / PACK_GA_SIZE) +# define PACK_GA_SIZE 3 /* Size of a packed GA in words */ + /* Size of a packed fetch-me in words */ +# define PACK_FETCHME_SIZE (PACK_GA_SIZE + _HS) +# define PACK_HDR_SIZE 4 /* Words of header in a packet */ + +# define PACK_HEAP_REQUIRED \ + (RtsFlags.GranFlags.packBufferSize * sizeofW(StgClosure*) + \ + 2 * sizeofW(StgInt) + sizeofW(StgTSO*)) + +# define PACK_FLAG_LOCN 0 +# define PACK_TSO_LOCN 1 +# define PACK_UNPACKED_SIZE_LOCN 2 +# define PACK_SIZE_LOCN 3 +# define MAGIC_PACK_FLAG 0xfabc + +# define GA_HDR_SIZE 1 + +# define PROCS_HDR_POSN PAR_HDR_POSN +# define PROCS_HDR_SIZE 1 + +/* Accessing components of the field */ +# define PROCS(closure) ((closure)->header.gran.procs) +/* SET_PROCS is now SET_GRAN_HEADER in ClosureMacros.h. */ + +#endif /* GRAN */ + +/* + * @node End of File, , Parallel definitions + * @section End of File + */ + +#endif /* defined(PAR) || defined(GRAN) whole file */ + +#endif /* Parallel_H */ + +