FORM  4.3
Data Structures | Macros | Typedefs | Functions | Variables
parallel.h File Reference
#include <mpi.h>

Go to the source code of this file.

Data Structures

struct  PF_BUFFER
 
struct  ParallelVars
 

Macros

#define MASTER   0
 
#define PF_RESET   0
 
#define PF_TIME   1
 
#define PF_TERM_MSGTAG   10 /* master -> slave: sending terms */
 
#define PF_ENDSORT_MSGTAG   11 /* master -> slave: no more terms to be distributed, slave -> master: after EndSort() */
 
#define PF_DOLLAR_MSGTAG   12 /* slave -> master: sending $-variables */
 
#define PF_BUFFER_MSGTAG   20 /* slave -> master: sending sorted terms, or in PF_SendFile()/PF_RecvFile() */
 
#define PF_ENDBUFFER_MSGTAG   21 /* same as PF_BUFFER_MSGTAG, but indicates the end of operation */
 
#define PF_READY_MSGTAG   30 /* slave -> master: slave is idle and can accept terms */
 
#define PF_DATA_MSGTAG   50 /* InParallel, DoCheckpoint() */
 
#define PF_EMPTY_MSGTAG   52 /* InParallel, DoCheckpoint(), PF_SendFile(), PF_RecvFile() */
 
#define PF_STDOUT_MSGTAG   60 /* slave -> master: sending text to the stdout */
 
#define PF_LOG_MSGTAG   61 /* slave -> master: sending text to the log file */
 
#define PF_OPT_MCTS_MSGTAG   70 /* master <-> slave: optimization */
 
#define PF_OPT_HORNER_MSGTAG   71 /* master <-> slave: optimization */
 
#define PF_OPT_COLLECT_MSGTAG   72 /* slave -> master: optimization */
 
#define PF_MISC_MSGTAG   100
 
#define GNUC_PREREQ(major, minor, patchlevel)   0
 
#define indices   ((INDICES)(AC.IndexList.lijst))
 
#define PF_ANY_SOURCE   MPI_ANY_SOURCE
 
#define PF_ANY_MSGTAG   MPI_ANY_TAG
 
#define PF_COMM   MPI_COMM_WORLD
 
#define PF_BYTE   MPI_BYTE
 
#define PF_INT   MPI_INT
 
#define PF_LongMultiPack(buffer, count, type)   PF_LongMultiPackImpl(buffer, count, sizeof_datatype(type), type)
 
#define PF_LongMultiUnpack(buffer, count, type)   PF_LongMultiUnpackImpl(buffer, count, sizeof_datatype(type), type)
 

Typedefs

typedef struct ParallelVars PARALLELVARS
 

Functions

int PF_ISendSbuf (int, int)
 
int PF_Bcast (void *buffer, int count)
 
int PF_RawSend (int, void *, LONG, int)
 
LONG PF_RawRecv (int *, void *, LONG, int *)
 
int PF_PreparePack (void)
 
int PF_Pack (const void *buffer, size_t count, MPI_Datatype type)
 
int PF_Unpack (void *buffer, size_t count, MPI_Datatype type)
 
int PF_PackString (const UBYTE *str)
 
int PF_UnpackString (UBYTE *str)
 
int PF_Send (int to, int tag)
 
int PF_Receive (int src, int tag, int *psrc, int *ptag)
 
int PF_Broadcast (void)
 
int PF_PrepareLongSinglePack (void)
 
int PF_LongSinglePack (const void *buffer, size_t count, MPI_Datatype type)
 
int PF_LongSingleUnpack (void *buffer, size_t count, MPI_Datatype type)
 
int PF_LongSingleSend (int to, int tag)
 
int PF_LongSingleReceive (int src, int tag, int *psrc, int *ptag)
 
int PF_PrepareLongMultiPack (void)
 
int PF_LongMultiPackImpl (const void *buffer, size_t count, size_t eSize, MPI_Datatype type)
 
int PF_LongMultiUnpackImpl (void *buffer, size_t count, size_t eSize, MPI_Datatype type)
 
int PF_LongMultiBroadcast (void)
 
int PF_EndSort (void)
 
WORD PF_Deferred (WORD *, WORD)
 
int PF_Processor (EXPRESSIONS, WORD, WORD)
 
int PF_Init (int *, char ***)
 
int PF_Terminate (int)
 
LONG PF_GetSlaveTimes (void)
 
LONG PF_BroadcastNumber (LONG)
 
void PF_BroadcastBuffer (WORD **buffer, LONG *length)
 
int PF_BroadcastString (UBYTE *)
 
int PF_BroadcastPreDollar (WORD **, LONG *, int *)
 
int PF_CollectModifiedDollars (void)
 
int PF_BroadcastModifiedDollars (void)
 
int PF_BroadcastRedefinedPreVars (void)
 
int PF_BroadcastCBuf (int bufnum)
 
int PF_BroadcastExpFlags (void)
 
int PF_StoreInsideInfo (void)
 
int PF_RestoreInsideInfo (void)
 
int PF_BroadcastExpr (EXPRESSIONS e, FILEHANDLE *file)
 
int PF_BroadcastRHS (void)
 
int PF_InParallelProcessor (void)
 
int PF_SendFile (int to, FILE *fd)
 
int PF_RecvFile (int from, FILE *fd)
 
void PF_MLock (void)
 
void PF_MUnlock (void)
 
LONG PF_WriteFileToFile (int, UBYTE *, LONG)
 
void PF_FlushStdOutBuffer (void)
 

Variables

PARALLELVARS PF
 
LONG PF_maxDollarChunkSize
 

Detailed Description

Header file with things relevant to ParForm.

Definition in file parallel.h.

Function Documentation

◆ PF_ISendSbuf()

int PF_ISendSbuf ( int  to,
int  tag 
)

Nonblocking send operation. It sends everything from buff to fill of the active buffer. Depending on tag it also can do waiting for other sends to finish or set the active buffer to the next one.

Parameters
tothe destination process number.
tagthe message tag.
Returns
0 if OK, nonzero on error.

Definition at line 261 of file mpi.c.

◆ PF_Bcast()

int PF_Bcast ( void *  buffer,
int  count 
)

Broadcasts a message from the master to slaves.

Parameters
[in,out]bufferthe starting address of buffer. The contents in this buffer on the master will be transferred to those on the slaves.
countthe length of the buffer in bytes.
Returns
0 if OK, nonzero on error.

Definition at line 440 of file mpi.c.

◆ PF_RawSend()

int PF_RawSend ( int  dest,
void *  buf,
LONG  l,
int  tag 
)

Sends l bytes from buf to dest. Returns 0 on success, or -1.

Parameters
destthe destination process number.
bufthe send buffer.
lthe size of data in the send buffer in bytes.
tagthe message tag.
Returns
0 if OK, nonzero on error.

Definition at line 463 of file mpi.c.

◆ PF_RawRecv()

LONG PF_RawRecv ( int *  src,
void *  buf,
LONG  thesize,
int *  tag 
)

Receives not more than thesize bytes from src, returns the actual number of received bytes, or -1 on failure.

Parameters
[in,out]srcthe source process number. In output, that of the actual received message.
[out]bufthe receive buffer.
thesizethe size of the receive buffer in bytes.
[out]tagthe message tag of the actual received message.
Returns
the actual sizeof received data in bytes, or -1 on failure.

Definition at line 484 of file mpi.c.

◆ PF_PreparePack()

int PF_PreparePack ( void  )

Prepares for the next pack operations on the sender.

Returns
0 if OK, nonzero on error.

Definition at line 624 of file mpi.c.

◆ PF_Pack()

int PF_Pack ( const void *  buffer,
size_t  count,
MPI_Datatype  type 
)

Adds data into the pack buffer.

Parameters
bufferthe pointer to the buffer storing the data to be packed.
countthe number of elements in the buffer.
typethe data type of elements in the buffer.
Returns
0 if OK, nonzero on error.

Definition at line 642 of file mpi.c.

◆ PF_Unpack()

int PF_Unpack ( void *  buffer,
size_t  count,
MPI_Datatype  type 
)

Retrieves the next data in the pack buffer.

Parameters
[out]bufferthe pointer to the buffer to store the unpacked data.
countthe number of elements of data to be received.
typethe data type of elements of data to be received.
Returns
0 if OK, nonzero on error.

Definition at line 671 of file mpi.c.

◆ PF_PackString()

int PF_PackString ( const UBYTE *  str)

Packs a string str into the packed buffer PF_packbuf, including the trailing zero.

The first element (PF_INT) is the length of the packed portion of the string. If the string does not fit to the buffer PF_packbuf, the function packs only the initial portion. It returns the number of packed bytes, so if (str[length-1]=='\0') then the whole string fits to the buffer, if not, then the rest (str+length) bust be packed and send again. On error, the function returns the negative error code.

One exception: the string "\0!\0" is used as an image of the NULL, so all 3 characters will be packed.

Parameters
stra string to be packed.
Returns
the number of packed bytes, or a negative value on failure.

Definition at line 706 of file mpi.c.

◆ PF_UnpackString()

int PF_UnpackString ( UBYTE *  str)

Unpacks a string to str from the packed buffer PF_packbuf, including the trailing zero.

It returns the number of unpacked bytes, so if (str[length-1]=='\0') then the whole string was unpacked, if not, then the rest must be appended to (str+length). On error, the function returns the negative error code.

Parameters
[out]strthe buffer to store the unpacked string
Returns
the number of unpacked bytes, or a negative value on failure.

Definition at line 774 of file mpi.c.

◆ PF_Send()

int PF_Send ( int  to,
int  tag 
)

Sends the contents in the pack buffer to the process specified by to.

Example:

if ( PF.me == SRC ) {
// Packing operations here...
PF_Send(DEST, TAG);
}
else if ( PF.me == DEST ) {
PF_Receive(SRC, TAG, &actual_src, &actual_tag);
// Unpacking operations here...
}
Parameters
tothe destination process number.
tagthe message tag.
Returns
0 if OK, nonzero on error.

Definition at line 822 of file mpi.c.

◆ PF_Receive()

int PF_Receive ( int  src,
int  tag,
int *  psrc,
int *  ptag 
)

Receives data into the pack buffer from the process specified by src. This function allows &src == psrc or &tag == ptag. Either psrc or ptag can be NULL.

See the example of PF_Send().

Parameters
srcthe source process number (can be PF_ANY_SOURCE).
tagthe source message tag (can be PF_ANY_TAG).
[out]psrcthe actual source process number of received message.
[out]ptagthe received message tag.
Returns
0 if OK, nonzero on error.

Definition at line 848 of file mpi.c.

◆ PF_Broadcast()

int PF_Broadcast ( void  )

Broadcasts the contents in the pack buffer on the master to those on the slaves.

Example:

if ( PF.me == MASTER ) {
// Packing operations here...
}
if ( PF.me != MASTER ) {
// Unpacking operations here...
}
Returns
0 if OK, nonzero on error.

Definition at line 883 of file mpi.c.

◆ PF_PrepareLongSinglePack()

int PF_PrepareLongSinglePack ( void  )

Prepares for the next long-single-pack operations on the sender.

Returns
0 if OK, nonzero on error.

Definition at line 1451 of file mpi.c.

◆ PF_LongSinglePack()

int PF_LongSinglePack ( const void *  buffer,
size_t  count,
MPI_Datatype  type 
)

Adds data into the "long single" pack buffer.

Parameters
bufferthe pointer to the buffer storing the data to be packed.
countthe number of elements in the buffer.
typethe data type of elements in the buffer.
Returns
0 if OK, nonzero on error.

Definition at line 1469 of file mpi.c.

◆ PF_LongSingleUnpack()

int PF_LongSingleUnpack ( void *  buffer,
size_t  count,
MPI_Datatype  type 
)

Retrieves the next data in the "long single" pack buffer.

Parameters
[out]bufferthe pointer to the buffer to store the unpacked data.
countthe number of elements of data to be received.
typethe data type of elements of data to be received.
Returns
0 if OK, nonzero on error.

Definition at line 1503 of file mpi.c.

◆ PF_LongSingleSend()

int PF_LongSingleSend ( int  to,
int  tag 
)

Sends the contents in the "long single" pack buffer to the process specified by to.

Example:

if ( PF.me == SRC ) {
// Packing operations here...
PF_LongSingleSend(DEST, TAG);
}
else if ( PF.me == DEST ) {
PF_LongSingleReceive(SRC, TAG, &actual_src, &actual_tag);
// Unpacking operations here...
}
Parameters
tothe destination process number.
tagthe message tag.
Returns
0 if OK, nonzero on error.

Definition at line 1540 of file mpi.c.

◆ PF_LongSingleReceive()

int PF_LongSingleReceive ( int  src,
int  tag,
int *  psrc,
int *  ptag 
)

Receives data into the "long single" pack buffer from the process specified by src. This function allows &src == psrc or &tag == ptag. Either psrc or ptag can be NULL.

See the example of PF_LongSingleSend().

Parameters
srcthe source process number (can be PF_ANY_SOURCE).
tagthe source message tag (can be PF_ANY_TAG).
[out]psrcthe actual source process number of received message.
[out]ptagthe received message tag.
Returns
0 if OK, nonzero on error.

Definition at line 1583 of file mpi.c.

◆ PF_PrepareLongMultiPack()

int PF_PrepareLongMultiPack ( void  )

Prepares for the next long-multi-pack operations on the sender.

Returns
0 if OK, nonzero on error.

Definition at line 1643 of file mpi.c.

◆ PF_LongMultiPackImpl()

int PF_LongMultiPackImpl ( const void *  buffer,
size_t  count,
size_t  eSize,
MPI_Datatype  type 
)

Adds data into the "long multi" pack buffer.

Parameters
bufferthe pointer to the buffer storing the data to be packed.
countthe number of elements in the buffer.
eSizethe byte size of each element of data.
typethe data type of elements in the buffer.
Returns
0 if OK, nonzero on error.

Definition at line 1662 of file mpi.c.

◆ PF_LongMultiUnpackImpl()

int PF_LongMultiUnpackImpl ( void *  buffer,
size_t  count,
size_t  eSize,
MPI_Datatype  type 
)

Retrieves the next data in the "long multi" pack buffer.

Parameters
[out]bufferthe pointer to the buffer to store the unpacked data.
countthe number of elements of data to be received.
eSizethe byte size of each element of data.
typethe data type of elements of data to be received.
Returns
0 if OK, nonzero on error.

Definition at line 1721 of file mpi.c.

◆ PF_LongMultiBroadcast()

int PF_LongMultiBroadcast ( void  )

Broadcasts the contents in the "long multi" pack buffer on the master to those on the slaves.

Example:

if ( PF.me == MASTER ) {
// Packing operations here...
}
if ( PF.me != MASTER ) {
// Unpacking operations here...
}
Returns
0 if OK, nonzero on error.

Definition at line 1807 of file mpi.c.

◆ PF_EndSort()

int PF_EndSort ( void  )

Finishes a master sorting with collecting terms from slaves. Called by EndSort().

If this is not the masterprocess, just initialize the sendbuffers and return 0, else PF_EndSort() sends the rest of the terms in the sendbuffer to the next slave and a dummy message to all slaves with tag PF_ENDSORT_MSGTAG. Then it receives the sorted terms, sorts them using a recursive 'tree of losers' (PF_GetLoser()) and writes them to the outputfile.

Returns
1 if the sorting on the master was done. 0 if EndSort() still must perform a regular sorting becuase it is not at the ground level or not on the master or in the sequential mode or in the InParallel mode. -1 if an error occured.
Remarks
The slaves will send the sorted terms back to the master in the regular sorting (after the initialization of the send buffer in PF_EndSort()). See PutOut() and FlushOut().
This function has been changed such that when it returns 1, AM.S0->TermsLeft is set correctly. But AM.S0->GenTerms is not set: it will be set after collecting the statistics from the slaves at the end of PF_Processor(). (TU 30 Jun 2011)

Definition at line 864 of file parallel.c.

◆ PF_Deferred()

WORD PF_Deferred ( WORD *  term,
WORD  level 
)

Replaces Deferred() on the slaves.

Parameters
termthe term that must be multiplied by the contents of the current bracket.
levelthe compiler level.
Returns
0 if OK, nonzero on error.

Definition at line 1208 of file parallel.c.

◆ PF_Processor()

int PF_Processor ( EXPRESSIONS  e,
WORD  i,
WORD  LastExpression 
)

Replaces parts of Processor() on the masters and slaves. On the master PF_Processor() is responsible for proper distribution of terms from the input file to the slaves. On the slaves it calls Generator() for all the terms that this process gets, but PF_GetTerm() gets terms from the master (not directly from infile).

Parameters
eThe pointer to the current expression.
iThe index for the current expression.
LastExpressionThe flag indicating whether it is the last expression.
Returns
0 if OK, nonzero on error.

Definition at line 1540 of file parallel.c.

◆ PF_Init()

int PF_Init ( int *  argc,
char ***  argv 
)

All the library independent stuff. PF_LibInit() should do all library dependent initializations.

Parameters
argcpointer to the number of arguments.
argvpointer to the arguments.
Returns
0 if OK, nonzero on error.

Definition at line 1953 of file parallel.c.

◆ PF_Terminate()

int PF_Terminate ( int  errorcode)

Performs the finalization of ParFORM. To be called by Terminate().

Parameters
erroran error code.
Returns
0 if OK, nonzero on error.

Definition at line 2047 of file parallel.c.

References PF_LibTerminate().

◆ PF_GetSlaveTimes()

LONG PF_GetSlaveTimes ( void  )

Returns the total CPU time of all slaves together. This function must be called on the master and all slaves.

Returns
on the master, the sum of CPU times on all slaves.

Definition at line 2063 of file parallel.c.

◆ PF_BroadcastNumber()

LONG PF_BroadcastNumber ( LONG  x)

Broadcasts a LONG value from the master to the all slaves.

Parameters
xthe number to be broadcast (set on the master).
Returns
the synchronised result.

Definition at line 2083 of file parallel.c.

◆ PF_BroadcastBuffer()

void PF_BroadcastBuffer ( WORD **  buffer,
LONG *  length 
)

Broadcasts a buffer from the master to all the slaves.

Parameters
[in,out]bufferon the master, the buffer to be broadcast. On the slaves, the buffer will be allocated if the length is greater than 0. The caller must free it.
[in,out]lengthon the master, the length of the buffer to be broadcast. On the slaves, it receives the length of transfered buffer. The actual transfer occurs only if the length is greater than 0.

Definition at line 2110 of file parallel.c.

◆ PF_BroadcastString()

int PF_BroadcastString ( UBYTE *  str)

Broadcasts a string from the master to all slaves.

Parameters
[in,out]strThe pointer to a null-terminated string.
Returns
0 if OK, nonzero on error.

Definition at line 2152 of file parallel.c.

◆ PF_BroadcastPreDollar()

int PF_BroadcastPreDollar ( WORD **  dbuffer,
LONG *  newsize,
int *  numterms 
)

Broadcasts dollar variables set as a preprocessor variables. Only the master is able to make an assignment like #$a=g; where g is an expression: only the master has an access to the expression. So, the master broadcasts the result to slaves.

The result is in *dbuffer of the size is *newsize (in number of WORDs), +1 for trailing zero. For slave newsize and numterms are output parameters.

Parameters
[in,out]dbufferthe buffer for a dollar variable.
[in,out]newsizethe size of the dollar variable in WORDs.
[in,out]numtermsthe number of terms in the dollar variable.
Returns
0 if OK, nonzero on error.

Definition at line 2207 of file parallel.c.

◆ PF_CollectModifiedDollars()

int PF_CollectModifiedDollars ( void  )

Combines modified dollar variables on the all slaves, and store them into those on the master.

The potentially modified dollar variables are given in PotModdollars, and the number of them is given by NumPotModdollars.

The current module could be executed in parallel only if all potentially modified variables are listed in ModOptdollars, otherwise the module was switched to the sequential mode.

Returns
0 if OK, nonzero on error.

Definition at line 2495 of file parallel.c.

◆ PF_BroadcastModifiedDollars()

int PF_BroadcastModifiedDollars ( void  )

Broadcasts modified dollar variables on the master to the all slaves.

The potentially modified dollar variables are given in PotModdollars, and the number of them is given by NumPotModdollars.

The current module could be executed in parallel only if all potentially modified variables are listed in ModOptdollars, otherwise the module was switched to the sequential mode. In either cases, we need to broadcast them.

Returns
0 if OK, nonzero on error.

Definition at line 2774 of file parallel.c.

◆ PF_BroadcastRedefinedPreVars()

int PF_BroadcastRedefinedPreVars ( void  )

Broadcasts preprocessor variables, which were changed by the Redefine statements in the current module, from the master to the all slaves.

The potentially redefined preprocessor variables are given in AC.pfirstnum, and the number of them is given by AC.numpfirstnum. For an actually redefined variable, the corresponding value in AC.inputnumbers is non-negative.

Returns
0 if OK, nonzero on error.

Definition at line 2991 of file parallel.c.

◆ PF_BroadcastCBuf()

int PF_BroadcastCBuf ( int  bufnum)

Broadcasts a compiler buffer specified by bufnum from the master to the all slaves.

Parameters
bufnumThe index of the compiler buffer to be broadcast.
Returns
0 if OK, nonzero on error.

Definition at line 3133 of file parallel.c.

◆ PF_BroadcastExpFlags()

int PF_BroadcastExpFlags ( void  )

Broadcasts AR.expflags and several properties of each expression, e.g., e->vflags, from the master to all slaves.

Returns
0 if OK, nonzero on error.

Definition at line 3244 of file parallel.c.

◆ PF_BroadcastExpr()

int PF_BroadcastExpr ( EXPRESSIONS  e,
FILEHANDLE file 
)

Broadcasts an expression from the master to the all slaves.

Parameters
eThe expression to be broadcast.
fileThe file in which the expression is sitting.
Returns
0 if OK, nonzero on error.

Definition at line 3536 of file parallel.c.

◆ PF_BroadcastRHS()

int PF_BroadcastRHS ( void  )

Broadcasts expressions appearing in the right-hand side from the master to the all slaves.

Returns
0 if OK, nonzero on error.

Definition at line 3564 of file parallel.c.

◆ PF_InParallelProcessor()

int PF_InParallelProcessor ( void  )

Processes expressions in the InParallel mode, i.e., dividing expressions marked by partodo over the slaves.

Returns
0 if OK, nonzero on error.

Definition at line 3611 of file parallel.c.

◆ PF_SendFile()

int PF_SendFile ( int  to,
FILE *  fd 
)

Sends a file to the process specified by to.

Parameters
tothe destination process number.
fdthe file to be sent.
Returns
the size of sent data in bytes, or -1 on error.

Definition at line 4207 of file parallel.c.

References PF_RawSend().

◆ PF_RecvFile()

int PF_RecvFile ( int  from,
FILE *  fd 
)

Receives a file from the process specified by from.

Parameters
fromthe source process number.
fdthe file to save the received data.
Returns
the size of received data in bytes, or -1 on error.

Definition at line 4245 of file parallel.c.

◆ PF_MLock()

void PF_MLock ( void  )

A function called by MLOCK(ErrorMessageLock) for slaves.

Definition at line 4326 of file parallel.c.

◆ PF_MUnlock()

void PF_MUnlock ( void  )

A function called by MUNLOCK(ErrorMessageLock) for slaves.

Definition at line 4342 of file parallel.c.

◆ PF_WriteFileToFile()

LONG PF_WriteFileToFile ( int  handle,
UBYTE *  buffer,
LONG  size 
)

Replaces WriteFileToFile() on the master and slaves.

It copies the given buffer into internal buffers if called between MLOCK(ErrorMessageLock) and MUNLOCK(ErrorMessageLock) for slaves and handle is StdOut or LogHandle, otherwise calls WriteFileToFile().

Parameters
handlea file handle that specifies the output.
buffera pointer to the source buffer containing the data to be written.
sizethe size of data to be written in bytes.
Returns
the actual size of data written to the output in bytes.

Definition at line 4371 of file parallel.c.

◆ PF_FlushStdOutBuffer()

void PF_FlushStdOutBuffer ( void  )

Explicitly Flushes the buffer for the standard output on the master, which is used if PF_ENABLE_STDOUT_BUFFERING is defined.

Definition at line 4465 of file parallel.c.