X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fparallel%2FLLC.h;fp=rts%2Fparallel%2FLLC.h;h=536e431bef11d108bd50ea19cdc718b940310550;hb=0065d5ab628975892cea1ec7303f968c3338cbe1;hp=0000000000000000000000000000000000000000;hpb=28a464a75e14cece5db40f2765a29348273ff2d2;p=ghc-hetmet.git diff --git a/rts/parallel/LLC.h b/rts/parallel/LLC.h new file mode 100644 index 0000000..536e431 --- /dev/null +++ b/rts/parallel/LLC.h @@ -0,0 +1,130 @@ +/* -------------------------------------------------------------------------- + Time-stamp: + + Low Level Communications Header (LLC.h) + + Contains the definitions used by the Low-level Communications + module of the GUM Haskell runtime environment. + Based on the Graph for PVM implementation. + + Phil Trinder, Glasgow University, 13th Dec 1994 + Adapted for the 4.xx RTS + H-W. Loidl, Heriot-Watt, November 1999 + ----------------------------------------------------------------------- */ + +#ifndef __LLC_H +#define __LLC_H + +#ifdef PAR + +//@node Low Level Communications Header, , , +//@section Low Level Communications Header + +//@menu +//* Includes:: +//* Macros and Constants:: +//* PVM macros:: +//* Externs:: +//@end menu + +//@node Includes, Macros and Constants, Low Level Communications Header, Low Level Communications Header +//@subsection Includes + +#include "Rts.h" +#include "Parallel.h" + +#include "PEOpCodes.h" +#include "pvm3.h" + +//@node Macros and Constants, PVM macros, Includes, Low Level Communications Header +//@subsection Macros and Constants + +#define ANY_TASK (-1) /* receive messages from any task */ +#define ANY_GLOBAL_TASK ANY_TASK +#define ANY_OPCODE (-1) /* receive any opcode */ +#define ALL_GROUP (-1) /* wait for barrier from every group member */ + +#define PEGROUP "PE" + +#define MGRGROUP "MGR" +#define SYSGROUP "SYS" + + +#define PETASK "PE" + +//@node PVM macros, Externs, Macros and Constants, Low Level Communications Header +//@subsection PVM macros + +#define sync(gp,op) do { \ + broadcast(gp,op); \ + pvm_barrier(gp,ALL_GROUP); \ + } while(0) + +#define broadcast(gp,op) do { \ + pvm_initsend(PvmDataDefault); \ + pvm_bcast(gp,op); \ + } while(0) + +#define checkComms(c,s) do { \ + if ((c)<0) { \ + pvm_perror(s); \ + stg_exit(EXIT_FAILURE); \ + }} while(0) + +#define _my_gtid pvm_mytid() +#define GetPacket() pvm_recv(ANY_TASK,ANY_OPCODE) +#define PacketsWaiting() (pvm_probe(ANY_TASK,ANY_OPCODE) != 0) + +#define SPARK_THREAD_DESCRIPTOR 1 +#define GLOBAL_THREAD_DESCRIPTOR 2 + +#define _extract_jump_field(v) (v) + +#define MAX_DATA_WORDS_IN_PACKET 1024 + +/* basic PVM packing */ +#define PutArg1(a) pvm_pklong((long *)&(a),1,1) +#define PutArg2(a) pvm_pklong((long *)&(a),1,1) +#define PutArgN(n,a) pvm_pklong((long *)&(a),1,1) +#define PutArgs(b,n) pvm_pklong((long *)b,n,1) + +#define PutLit(l) { int a = l; PutArgN(?,a); } + +/* basic PVM unpacking */ +#define GetArg1(a) pvm_upklong((long *)&(a),1,1) +#define GetArg2(a) pvm_upklong((long *)&(a),1,1) +#define GetArgN(n,a) pvm_upklong((long *)&(a),1,1) +#define GetArgs(b,n) pvm_upklong((long *)b,n,1) + +//@node Externs, , PVM macros, Low Level Communications Header +//@subsection Externs + +/* basic message passing routines */ +extern void sendOp (OpCode,GlobalTaskId), + sendOp1 (OpCode,GlobalTaskId,StgWord), + sendOp2 (OpCode,GlobalTaskId,StgWord,StgWord), + sendOpV (OpCode,GlobalTaskId,int,...), + sendOpN (OpCode,GlobalTaskId,int,StgPtr), + sendOpNV (OpCode,GlobalTaskId,int,StgPtr,int,...); + +extern void broadcastOpN(OpCode op, char *group, int n, StgPtr args); + +/* extracting data out of a packet */ +OpCode getOpcode (rtsPacket p); +void getOpcodeAndSender (rtsPacket p, OpCode *popcode, + GlobalTaskId *psender_id); +GlobalTaskId senderTask (rtsPacket p); +rtsPacket waitForPEOp(OpCode op, GlobalTaskId who, void(*processUnexpected)(rtsPacket) ); + +/* Init and shutdown routines */ +void startUpPE (void); +void shutDownPE(void); +int getExitCode(int nbytes, GlobalTaskId *sender_idp); + +/* aux functions */ +char *getOpName (unsigned op); // returns string of opcode +void processUnexpectedMessage (rtsPacket); +//void NullException(void); + +#endif /*PAR */ +#endif /*defined __LLC_H */