Logo Search packages:      
Sourcecode: lam version File versions  Download package

mpisys.h

/*
 * Copyright (c) 2001-2004 The Trustees of Indiana University.  
 *                         All rights reserved.
 * Copyright (c) 1998-2001 University of Notre Dame. 
 *                         All rights reserved.
 * Copyright (c) 1994-1998 The Ohio State University.  
 *                         All rights reserved.
 * 
 * This file is part of the LAM/MPI software package.  For license
 * information, see the LICENSE file in the top level directory of the
 * LAM/MPI source distribution.
 * 
 * $HEADER$
 *
 * $Id: mpisys.h,v 6.64 2004/03/02 03:43:26 jsquyres Exp $
 *
 *    Function:   - MPI system header file
 *                - the real meat is here
 */

#ifndef _MPISYS_H
#define _MPISYS_H

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

#include <lam_config.h>
#include <all_list.h>
#include <all_hash.h>
#include <app_mgmt.h>
#include <kio.h>
#include <mpi.h>
#include <portable.h>
#include <terror.h>
#include <all_opt.h>
#include <lam-ssi-coll.h>


/*
 * LAM constants & macros
 */
#define LAM_PREDEF            0x01        /* object is predefined */
#define LAM_LANGF77           0x02        /* object created in F77 code */
#define LAM_COLLMAXLIN        4           /* linear coll. op. threshold */
#define LAM_COLLMAXDIM        16          /* maximum cube dimension */
#define LAM_PORTLEN           16          /* maximum port name length */


/*
 * These constants correspond to FORTRAN datatypes.  They are used internally
 * and should not be visible to C MPI user code.
 */
#define     MPI_F_INTEGER           ((MPI_Datatype) &lam_mpi_integer)
#define MPI_F_INTEGER1          ((MPI_Datatype) &lam_mpi_integer1) 
#define MPI_F_INTEGER2          ((MPI_Datatype) &lam_mpi_integer2)
#define MPI_F_INTEGER4          ((MPI_Datatype) &lam_mpi_integer4)
#define MPI_F_INTEGER8          ((MPI_Datatype) &lam_mpi_integer8)
#define     MPI_F_REAL        ((MPI_Datatype) &lam_mpi_real)
#define MPI_F_REAL4             ((MPI_Datatype) &lam_mpi_real4)
#define MPI_F_REAL8             ((MPI_Datatype) &lam_mpi_real8)
#define MPI_F_REAL16            ((MPI_Datatype) &lam_mpi_real16)
#define     MPI_F_DOUBLE_PRECISION  ((MPI_Datatype) &lam_mpi_dblprec)
#define     MPI_F_CHARACTER         ((MPI_Datatype) &lam_mpi_character)
#define     MPI_F_LOGICAL           ((MPI_Datatype) &lam_mpi_logic)
#define MPI_F_COMPLEX         ((MPI_Datatype) &lam_mpi_cplex)
#define MPI_F_DOUBLE_COMPLEX  ((MPI_Datatype) &lam_mpi_dblcplex)
#define MPI_F_2INTEGER        ((MPI_Datatype) &lam_mpi_2integer)
#define MPI_F_2REAL           ((MPI_Datatype) &lam_mpi_2real)
#define MPI_F_2DOUBLE_PRECISION     ((MPI_Datatype) &lam_mpi_2dblprec)

/*
 * These constants correspnd to C++ datatypes.  They are used internally
 * and should not be visible to C/Fortran MPI user code.
 */
#define MPI_CXX_BOOL            ((MPI_Datatype) &lam_mpi_cxx_bool)
#define MPI_CXX_COMPLEX         ((MPI_Datatype) &lam_mpi_cxx_cplex)
#define MPI_CXX_DOUBLE_COMPLEX  ((MPI_Datatype) &lam_mpi_cxx_dblcplex)
#define MPI_CXX_LONG_DOUBLE_COMPLEX ((MPI_Datatype) &lam_mpi_cxx_ldblcplex)

/*
 * Fortran copy and delete function generic types.
 */
typedef void (MPI_F_copy_function)(int *, int *, int *,
                              int *, int *, int *, int *);
typedef void (MPI_F_delete_function)(int *, int *, int *, int *, int *);

typedef void (*lam_void_fn_t)(void); 

/*
 * One sided communication.
 */
#define     LAM_OSD_HEADER          0
#define     LAM_OSD_ACCUMULATE      1
#define     LAM_OSD_GET       2
#define     LAM_OSD_PUT       3
#define     LAM_OSD_FENCE           4
#define     LAM_OSD_START           5
#define     LAM_OSD_COMPLETE  6
#define     LAM_OSD_POST            7
#define     LAM_OSD_WAIT            8

/*
 * structures
 */
struct _dtype {
      int         dt_format;
#define LAM_DTBASIC           0           /* basic datatype */
#define LAM_DTCONTIG          1           /* contiguous */
#define LAM_DTVECTOR          2           /* vector */
#define LAM_DTHVECTOR         3           /* hvector */
#define LAM_DTINDEXED         4           /* indexed */
#define LAM_DTHINDEXED        5           /* hindexed */
#define LAM_DTSTRUCT          6           /* struct */
#define LAM_DTHVECTORCREAT    7           /* extended vector */
#define     LAM_DTHINDEXEDCREAT     8           /* extended indexed */
#define     LAM_DTSTRUCTCREAT       9           /* extended struct */
#define LAM_DTINDEXEDBLK      10          /* indexed block */
#define LAM_DTSUBARRAY        11          /* local array */
#define LAM_DTDARRAY          12          /* distributed array */
      int         dt_flags;
#define LAM_DTHASUB           0x0010            /* ub is in the type map? */
#define LAM_DTHASLB           0x0020            /* lb is in the type map? */
#define LAM_DTNOPACK          0x0040            /* no packing required? */
#define LAM_DTNOXADJ          0x0080            /* extent not adjusted? */
#define LAM_DTLOWSET          0x0100            /* lower bound set */
#define LAM_DTHIGHSET         0x0200            /* upper bound set */
#define LAM_DTF77ORDER        0x0400            /* column major? */
#define LAM_DTISDUP           0x0800            /* duped type */
#define LAM_DTISRESIZE        0x1000            /* resized type */
      int         dt_commit;        /* committed? */
      int         dt_refcount;            /* reference count */
      int         dt_f77handle;           /* F77 handle */
      int         dt_label;         /* flat-form label */
      int         dt_align;         /* alignment */
      int         dt_upper;         /* upper extent */
      int         dt_lower;         /* lower extent */
      int         dt_size;          /* basic size */
      int         dt_dataup;        /* data upper limit */
      int         dt_datalow;       /* data lower limit */
      int         dt_nelem;         /* # top elements */
      int         dt_count;         /* count */
      int         dt_length;        /* vector length */
      MPI_Aint    dt_stride;        /* vector stride */
      MPI_Datatype      dt_dtype;         /* c/v/i datatype */
      int         *dt_lengths;            /* i/s lengths */
      MPI_Aint    *dt_disps;        /* i/s displacements */
      MPI_Datatype      *dt_dtypes;       /* struct datatypes */
      HASH        *dt_keys;         /* keys cache hash table */
      int         *dt_uargs;        /* record user arguments */
      char        dt_name[MPI_MAX_OBJECT_NAME];
        long            dt_reserved[4];         /* for expansion */
};

struct _group {
      int         g_nprocs;         /* # processes */
      int         g_myrank;         /* my local rank */
      int         g_refcount;       /* reference count */
      int         g_f77handle;            /* F77 handle */
      struct _proc      **g_procs;        /* processes */
};

struct _comm {
      int         c_flags;          /* properties */
#define LAM_CINTER      0x10              /* intercommunicator? */
#define LAM_CLDEAD      0x20              /* local group dead? */
#define LAM_CRDEAD      0x40              /* remote group dead? */
#define LAM_CIMPI 0x80              /* IMPI communicators */
#define LAM_CHOMOG      0x100             /* this comm is endian homog */
#define LAM_CHIDDEN     0x200             /* hidden communications */
#define LAM_RBASIC      0x400                   /* lam_basic req - intercomm */
      int         c_contextid;            /* context ID */
      int         c_refcount;       /* reference count */
      MPI_Group   c_group;          /* local group */
      MPI_Group   c_rgroup;         /* remote group */
      HASH        *c_keys;          /* keys cache hash table */
      int         c_cube_dim;       /* inscribing cube dim. */
      int         c_topo_type;            /* topology type */
      int         c_topo_nprocs;          /* # topo. processes */
      int         c_topo_ndims;           /* # cart. dimensions */
      int         c_topo_nedges;          /* # graph edges */
      int         *c_topo_dims;           /* cart. dimensions */
      int         *c_topo_coords;         /* cart. coordinates */
      int         *c_topo_index;          /* graph indices */
      int         *c_topo_edges;          /* graph edges */
      int         c_f77handle;            /* F77 handle */
      MPI_Win           c_window;         /* window (if any) on comm */
      MPI_Errhandler    c_errhdl;         /* error handler */
      char        c_name[MPI_MAX_OBJECT_NAME];
  /* This is not #if WANT_IMPI'ed out so that we can stay binary
     compatible with non-IMPI compiled programs */
        MPI_Comm        c_shadow;               /* shadow com for IMPI comms */
        long            c_reserved[4];          /* used in IMPI :-( */

        lam_ssi_coll_actions_1_1_0_t  c_ssi_coll;
        struct lam_ssi_coll_data *c_ssi_coll_data;
        struct lam_ssi_coll_lam_basic_data *c_ssi_coll_lam_basic_data;

  /* Store lam_basic_finalize pointer because we need to call 
     lam_basic_finalize() whenever a module needs support of lam_basic.  This
     typically happens in case of intercommunicators which need support
     from lam_basic (local communicator that gets created in lam_basic).
     lam_basic_finalize() should be called to destroy this local communicator
     and free the local structure
  */
        lam_ssi_coll_finalize_fn_t lsca_basic_finalize;
};

struct _osdhdr {
      int         os_func;          /* one sided function */
      int         os_op;                  /* accumulate operation */
      int         os_count;         /* target count */
      int         os_format;        /* target datatype format */
      int         os_type;          /* target datatype basic type */
      int         os_blklen;        /* target datatype block len. */
      int         os_stride;        /* target datatype stride */
      int         os_dcount;        /* target datatype count */
      int8        os_disp;          /* target displacement */
};

struct _window {
      MPI_Comm    w_comm;                 /* window communicator */
      void        *w_base;          /* window base address */
      MPI_Aint    w_size;                 /* window size (bytes) */
      int         w_disp_unit;            /* window disp unit (bytes) */
      int         w_flags;          /* window state flags */
#define LAM_WFACCEPOCH  0x010             /* window in access epoch */
#define LAM_WFEXPEPOCH  0x020             /* window in exposure epoch */
#define LAM_WFPOSTED    0x040             /* win/proc has been posted */
#define     LAM_WFSTARTED     0x080             /* win/proc has been started */
#define LAM_WFNOOUT     0x100             /* window closed */
      int         w_ngroup;         /* num procs in 2 party synch */
      int         w_ncomplete;            /* num of procs to complete */
      int         w_nfence;         /* num of procs to fence */
      int         *w_pstate;        /* state of processes */
      int         w_f77handle;            /* F77 handle */
      HASH        *w_keys;          /* attributes */
      MPI_Request w_req;                  /* header receive request */
      struct _osdhdr    w_header;         /* incoming protocol header */
      MPI_Errhandler    w_errhdl;         /* error handler */
      long        w_reserved[4];          /* for expansion */
};

struct _op {
      void        (*op_func)();           /* reduction function */
      int         op_commute;       /* commutative? */
      int         op_f77handle;           /* F77 handle */
      int         op_flags;         /* properties */
};

struct _errhdl {
      void        (*eh_func)();           /* error function */
      int         eh_refcount;            /* reference count */
      int         eh_f77handle;           /* F77 handle */
      int         eh_flags;         /* properties */
#define LAM_EHCOMM      0x10              /* communicator error handler */
#define LAM_EHWIN 0x20              /* window error handler */
#define LAM_EHFILE      0x40              /* file error handler */
};

struct _attrkey {
      lam_void_fn_t     ak_copy;          /* copy function */
      lam_void_fn_t     ak_del;           /* delete function */
      void        *ak_extra;        /* extra info */
      int         ak_refcount;            /* reference count */
      int         ak_flags;         /* properties */
#define LAM_AKCOMM      0x10              /* communicator key */
#define LAM_AKWIN 0x20              /* window key */
#define LAM_AKTYPE      0x40              /* datatype key */
};

struct _attr {
      int         a_key;                  /* attribute key */
      void        *a_value;         /* attribute value */
};

/*
 * If this is changed be sure to update MPI_BSEND_OVERHEAD appropriately
 * in mpi.h and mpif.h.  
 */
struct _bsndhdr {
      MPI_Request bsh_req;
      int         bsh_size;
      struct _bsndhdr   *bsh_prev;
      struct _bsndhdr   *bsh_next;
};

struct _fyimsg {
      int4        fym_src;          /* src global/local rank */
      int4        fym_dest;         /* dest global/local rank */
      int4        fym_count;        /* count */
      int4        fym_dtpid;        /* datatype/pid */
};

struct _fyiproc {
      int4        fyp_me;                 /* my global/local rank */
      int4        fyp_peer;         /* peer global/local rank */
      int4        fyp_peergps;            /* peer node/index */
      int4        fyp_root;         /* root global/local rank */
      int4        fyp_rootgps;            /* root node/index */
      int4        fyp_cidtag;       /* context ID & tag */
      int4        fyp_func;         /* top level function */
      int4        fyp_count;        /* count */
      int4        fyp_dtype;        /* datatype */
};

struct _infoent {
      char        *ie_value;
      char        ie_key[MPI_MAX_INFO_KEY + 1];
};

struct _info {
      LIST        *info_list;
      int         info_f77handle;
};

struct _port {
      char        prt_name[LAM_PORTLEN + 1];
      int         prt_num;
};

/*
 * for internal purposes
 */
extern MPI_Comm         lam_comm_parent;
extern struct _proc     *lam_myproc;
extern struct _proc     **lam_procs;
extern int        lam_num_procs;
extern LIST       *lam_comms;
extern LIST       *lam_ports;
extern float8           lam_clockskew;
extern int        lam_f77init;
extern int        lam_c2c;
#if LAM_WANT_IMPI
extern int        lam_impi;
#endif

extern int        lam_ger;
extern int        lam_homog;
extern struct jobid_t   lam_jobid;
extern int        lam_universe_size;
extern int        lam_universe_ncpus;
extern int        lam_universe_nnodes;
extern int        lam_appnum;
extern int        lam_rq_flblock;
extern int        lam_rq_nreqs;
extern int        lam_rq_nactv;
extern int        lam_seqnum;
extern MPI_Request      lam_rq_top;
extern MPI_Request      lam_rq_bottom;
extern int        lam_topfunc;
extern int        lam_flinit;
extern int        lam_flfinal;
extern int        lam_mpi_max_tag;
extern int        lam_mpi_max_cid;
extern MPI_Datatype     lam_osdhdr_type;

extern OPT              *lam_mpi_ao;

extern char             *lam_argv0;

extern struct kio_t     _kio;             /* kernel I/O block */

/* Variable instantiated & initialised in lammpiinit.c for TotalView
   DLL support */
extern int lam_tv_comm_seqnum;

/*
 * state checking macros
 */
#define     LAM_IS_INTER(c)   ((c)->c_flags & LAM_CINTER)   /* is an intercomm */
#define LAM_REQ_COLL_BASIC(c) ((c)->c_flags & LAM_RBASIC)
#define LAM_IS_INTRA(c) (!((c)->c_flags & LAM_CINTER))      /* is an intracomm */
#if LAM_WANT_IMPI
#define LAM_IS_IMPI(c)  ((c)->c_shadow != 0)            /* is an IMPI comm */
#endif
#define LAM_IS_CART(c)  ((c)->c_topo_type == MPI_CART)      /* is cartesian */
#define LAM_IS_GRAPH(c) ((c)->c_topo_type == MPI_GRAPH)     /* is graph */

/*
 * useful tracing macros
 */
#define LAM_TRACE(a)    if ((_kio.ki_rtf & RTF_TRON) == RTF_TRON) a

#define LAM_TRACE_TOP() \
            (((_kio.ki_rtf & RTF_TRON) == RTF_TRON) && (!lam_tr_incff()))

/*
 * overhead reduction
 */
#define _mpi_req_add_m(req)                     \
{                                         \
      if (lam_rq_top == 0) {                    \
            lam_rq_top = (req);                 \
      } else {                            \
            lam_rq_bottom->rq_next = (req);           \
      }                                   \
                                          \
      lam_rq_bottom = (req);                    \
      (req)->rq_next = 0;                       \
                                          \
      ++lam_rq_nreqs;                           \
}

#define _mpi_req_rem_m(req)                           \
{                                               \
      MPI_Request _p, _p2;                      \
      for (_p = lam_rq_top, _p2 = 0; _p && (_p != (req));   \
            _p2 = _p, _p = _p->rq_next);              \
      if (_p) {                                 \
        if (_p == lam_rq_top) {                       \
          lam_rq_top = _p->rq_next;                   \
        } else {                                \
          _p2->rq_next = _p->rq_next;                       \
        }                                       \
        if (_p == lam_rq_bottom) lam_rq_bottom = _p2;       \
        --lam_rq_nreqs;                         \
      }                                         \
}

#define _mpi_req_blkclr_m()                     \
{                                         \
      MPI_Request _p;                     \
      for (_p = lam_rq_top; _p; _p = _p->rq_next) {   \
            _p->rq_flags &= ~LAM_RQFBLOCK;            \
      }                                   \
      lam_rq_flblock = 0;                       \
}

#define _mpi_req_blkset_m(req)                  \
{                                   \
      (req)->rq_flags |= LAM_RQFBLOCK;    \
      lam_rq_flblock = 1;                 \
}

/* Used to be macros - now more complex functions */
#define lam_setfunc_m(locfunc) lam_setfunc((locfunc))
#define lam_resetfunc_m(locfunc) lam_resetfunc((locfunc))
#define lam_getfunc_m() lam_getfunc()


#define lam_inited_m()  (lam_flinit)

/* This has been replaced with slightly more complex functionality, so
   just have it call the real function  */

#define lam_initerr_m() lam_initerr()


/*
 * In some cases, the underlying memcpy() is broken.  So we have our
 * own.  See the note in share/mpi/lammemcpy.c for more details.
 */

#if LAM_WANT_PREFIX_MEMCPY
  extern void *lam_memcpy(void *dest, const void *src, size_t size);
#else
  #define lam_memcpy(a, b, c) memcpy((a), (b), (c))
#endif


/*
 * profiling
 */
#ifdef LAM_PROFILELIB

#define MPIL_Comm_id                PMPIL_Comm_id
#define MPIL_Comm_gps               PMPIL_Comm_gps
#define MPIL_Comm_parent            PMPIL_Comm_parent
#define MPIL_Signal                 PMPIL_Signal
#define MPIL_Spawn                  PMPIL_Spawn
#define MPIL_Type_id                PMPIL_Type_id
#define MPIL_Spawn                  PMPIL_Spawn
#define MPIL_Universe_size          PMPIL_Universe_size
#define MPIL_Trace_on               PMPIL_Trace_on
#define MPIL_Trace_off              PMPIL_Trace_off
#define MPIL_Request_set_name           PMPIL_Request_set_name
#define MPIL_Request_get_name           PMPIL_Request_get_name

#define MPI_Abort             PMPI_Abort 
#define MPI_Accumulate              PMPI_Accumulate
#define MPI_Address                 PMPI_Address
#define MPI_Allgather               PMPI_Allgather 
#define MPI_Allgatherv              PMPI_Allgatherv 
#define MPI_Alloc_mem               PMPI_Alloc_mem
#define MPI_Allreduce               PMPI_Allreduce 
#define MPI_Alltoall                PMPI_Alltoall 
#define MPI_Alltoallv               PMPI_Alltoallv 
#define MPI_Alltoallw                   PMPI_Alltoallw
#define MPI_Attr_delete             PMPI_Attr_delete 
#define MPI_Attr_get                PMPI_Attr_get 
#define MPI_Attr_put                PMPI_Attr_put 
#define MPI_Barrier                 PMPI_Barrier 
#define MPI_Bcast             PMPI_Bcast 
#define MPI_Bsend             PMPI_Bsend 
#define MPI_Bsend_init              PMPI_Bsend_init 
#define MPI_Buffer_attach           PMPI_Buffer_attach 
#define MPI_Buffer_detach           PMPI_Buffer_detach 
#define MPI_Cancel                  PMPI_Cancel 
#define MPI_Cart_coords             PMPI_Cart_coords 
#define MPI_Cart_create             PMPI_Cart_create 
#define MPI_Cart_get                PMPI_Cart_get 
#define MPI_Cart_map                PMPI_Cart_map 
#define MPI_Cart_rank               PMPI_Cart_rank 
#define MPI_Cart_shift              PMPI_Cart_shift 
#define MPI_Cart_sub                PMPI_Cart_sub 
#define MPI_Cartdim_get             PMPI_Cartdim_get 
#define MPI_Close_port              PMPI_Close_port
#define MPI_Comm_accept             PMPI_Comm_accept
#define MPI_Comm_c2f                PMPI_Comm_c2f
#define MPI_Comm_compare            PMPI_Comm_compare 
#define MPI_Comm_connect            PMPI_Comm_connect
#define MPI_Comm_create             PMPI_Comm_create 
#define MPI_Comm_create_errhandler  PMPI_Comm_create_errhandler
#define MPI_Comm_create_keyval            PMPI_Comm_create_keyval
#define MPI_Comm_delete_attr        PMPI_Comm_delete_attr 
#define MPI_Comm_disconnect         PMPI_Comm_disconnect
#define MPI_Comm_dup                PMPI_Comm_dup 
#define MPI_Comm_f2c                PMPI_Comm_f2c
#define MPI_Comm_free               PMPI_Comm_free 
#define MPI_Comm_free_keyval        PMPI_Comm_free_keyval
#define MPI_Comm_get_attr           PMPI_Comm_get_attr 
#define MPI_Comm_get_contextid            PMPI_Comm_get_contextid 
#define MPI_Comm_get_errhandler           PMPI_Comm_get_errhandler
#define MPI_Comm_get_name           PMPI_Comm_get_name
#define MPI_Comm_get_parent         PMPI_Comm_get_parent
#define MPI_Comm_group              PMPI_Comm_group 
#define MPI_Comm_join               PMPI_Comm_join
#define MPI_Comm_rank               PMPI_Comm_rank 
#define MPI_Comm_remote_group       PMPI_Comm_remote_group 
#define MPI_Comm_remote_size        PMPI_Comm_remote_size 
#define MPI_Comm_set_attr           PMPI_Comm_set_attr 
#define MPI_Comm_set_errhandler           PMPI_Comm_set_errhandler
#define MPI_Comm_set_name           PMPI_Comm_set_name 
#define MPI_Comm_size               PMPI_Comm_size 
#define MPI_Comm_spawn              PMPI_Comm_spawn
#define MPI_Comm_spawn_multiple           PMPI_Comm_spawn_multiple
#define MPI_Comm_split              PMPI_Comm_split 
#define MPI_Comm_test_inter         PMPI_Comm_test_inter 
#define MPI_Dims_create             PMPI_Dims_create 
#define MPI_Errhandler_c2f              PMPI_Errhandler_c2f
#define MPI_Errhandler_create       PMPI_Errhandler_create 
#define MPI_Errhandler_free         PMPI_Errhandler_free 
#define MPI_Errhandler_f2c              PMPI_Errhandler_f2c
#define MPI_Errhandler_get          PMPI_Errhandler_get 
#define MPI_Errhandler_set          PMPI_Errhandler_set 
#define MPI_Error_class             PMPI_Error_class 
#define MPI_Error_string            PMPI_Error_string 
#define MPI_Exscan                      PMPI_Exscan
#define MPI_Finalize                PMPI_Finalize 
#define MPI_Finalized               PMPI_Finalized
#define MPI_Free_mem                PMPI_Free_mem
#define MPI_Gather                  PMPI_Gather 
#define MPI_Gatherv                 PMPI_Gatherv 
#define MPI_Get                     PMPI_Get
#define MPI_Get_address             PMPI_Get_address
#define MPI_Get_count               PMPI_Get_count 
#define MPI_Get_elements            PMPI_Get_elements 
#define MPI_Get_processor_name            PMPI_Get_processor_name 
#define MPI_Get_version             PMPI_Get_version
#define MPI_Graph_create            PMPI_Graph_create 
#define MPI_Graph_get               PMPI_Graph_get 
#define MPI_Graph_map               PMPI_Graph_map 
#define MPI_Graph_neighbors         PMPI_Graph_neighbors 
#define MPI_Graph_neighbors_count   PMPI_Graph_neighbors_count 
#define MPI_Graphdims_get           PMPI_Graphdims_get 
#define MPI_Group_c2f               PMPI_Group_c2f
#define MPI_Group_compare           PMPI_Group_compare 
#define MPI_Group_difference        PMPI_Group_difference 
#define MPI_Group_excl              PMPI_Group_excl 
#define MPI_Group_f2c               PMPI_Group_f2c
#define MPI_Group_free              PMPI_Group_free 
#define MPI_Group_incl              PMPI_Group_incl 
#define MPI_Group_intersection            PMPI_Group_intersection 
#define MPI_Group_range_excl        PMPI_Group_range_excl 
#define MPI_Group_range_incl        PMPI_Group_range_incl 
#define MPI_Group_rank              PMPI_Group_rank 
#define MPI_Group_size              PMPI_Group_size 
#define MPI_Group_translate_ranks   PMPI_Group_translate_ranks 
#define MPI_Group_union             PMPI_Group_union 
#define MPI_Ibsend                  PMPI_Ibsend 
#define MPI_Info_c2f                PMPI_Info_c2f
#define MPI_Info_create             PMPI_Info_create 
#define MPI_Info_delete             PMPI_Info_delete
#define MPI_Info_dup                PMPI_Info_dup 
#define MPI_Info_f2c                PMPI_Info_f2c
#define MPI_Info_free               PMPI_Info_free 
#define MPI_Info_get                PMPI_Info_get 
#define MPI_Info_get_nkeys          PMPI_Info_get_nkeys 
#define MPI_Info_get_nthkey         PMPI_Info_get_nthkey 
#define MPI_Info_get_valuelen             PMPI_Info_get_valuelen 
#define MPI_Info_set                PMPI_Info_set 
#define MPI_Init              PMPI_Init 
#define MPI_Init_thread             PMPI_Init_thread
#define MPI_Initialized             PMPI_Initialized 
#define MPI_Intercomm_create        PMPI_Intercomm_create
#define MPI_Intercomm_merge         PMPI_Intercomm_merge
#define MPI_Iprobe                  PMPI_Iprobe 
#define MPI_Irecv             PMPI_Irecv 
#define MPI_Irsend                  PMPI_Irsend 
#define MPI_Is_thread_main          PMPI_Is_thread_main
#define MPI_Isend             PMPI_Isend 
#define MPI_Issend                  PMPI_Issend 
#define MPI_Keyval_create           PMPI_Keyval_create 
#define MPI_Keyval_free             PMPI_Keyval_free 
#define MPI_Lookup_name             PMPI_Lookup_name
#define MPI_Op_c2f                  PMPI_Op_c2f
#define MPI_Op_create               PMPI_Op_create 
#define MPI_Op_f2c                  PMPI_Op_f2c
#define MPI_Op_free                 PMPI_Op_free 
#define MPI_Open_port               PMPI_Open_port
#define MPI_Pack              PMPI_Pack 
#define MPI_Pack_size               PMPI_Pack_size 
#define MPI_Pcontrol                PMPI_Pcontrol 
#define MPI_Probe             PMPI_Probe 
#define MPI_Publish_name            PMPI_Publish_name
#define MPI_Put                     PMPI_Put
#define MPI_Query_thread            PMPI_Query_thread
#define MPI_Recv              PMPI_Recv 
#define MPI_Recv_init               PMPI_Recv_init 
#define MPI_Reduce                  PMPI_Reduce 
#define MPI_Reduce_scatter          PMPI_Reduce_scatter 
#define MPI_Request_c2f             PMPI_Request_c2f
#define MPI_Request_f2c             PMPI_Request_f2c
#define MPI_Request_free            PMPI_Request_free 
#define MPI_Rsend             PMPI_Rsend 
#define MPI_Rsend_init              PMPI_Rsend_init 
#define MPI_Scan              PMPI_Scan 
#define MPI_Scatter                 PMPI_Scatter 
#define MPI_Scatterv                PMPI_Scatterv 
#define MPI_Send              PMPI_Send 
#define MPI_Send_init               PMPI_Send_init 
#define MPI_Sendrecv                PMPI_Sendrecv 
#define MPI_Sendrecv_replace        PMPI_Sendrecv_replace 
#define MPI_Ssend             PMPI_Ssend 
#define MPI_Ssend_init              PMPI_Ssend_init 
#define MPI_Start             PMPI_Start 
#define MPI_Startall                PMPI_Startall
#define MPI_Status_c2f              PMPI_Status_c2f
#define MPI_Status_f2c              PMPI_Status_f2c
#define MPI_Test              PMPI_Test 
#define MPI_Test_cancelled          PMPI_Test_cancelled
#define MPI_Testall                 PMPI_Testall 
#define MPI_Testany                 PMPI_Testany 
#define MPI_Testsome                PMPI_Testsome 
#define MPI_Topo_test               PMPI_Topo_test 
#define MPI_Type_c2f                PMPI_Type_c2f
#define MPI_Type_commit             PMPI_Type_commit 
#define MPI_Type_contiguous         PMPI_Type_contiguous 
#define MPI_Type_create_darray            PMPI_Type_create_darray
#define MPI_Type_create_hindexed    PMPI_Type_create_hindexed
#define MPI_Type_create_hvector           PMPI_Type_create_hvector
#define MPI_Type_create_keyval            PMPI_Type_create_keyval
#define MPI_Type_create_resized           PMPI_Type_create_resized
#define MPI_Type_create_struct            PMPI_Type_create_struct
#define MPI_Type_create_subarray    PMPI_Type_create_subarray
#define MPI_Type_delete_attr        PMPI_Type_delete_attr 
#define MPI_Type_dup                PMPI_Type_dup 
#define MPI_Type_extent             PMPI_Type_extent 
#define MPI_Type_f2c                PMPI_Type_f2c
#define MPI_Type_free               PMPI_Type_free 
#define MPI_Type_free_keyval        PMPI_Type_free_keyval
#define MPI_Type_get_attr           PMPI_Type_get_attr 
#define MPI_Type_get_contents       PMPI_Type_get_contents
#define MPI_Type_get_envelope       PMPI_Type_get_envelope
#define MPI_Type_get_extent         PMPI_Type_get_extent
#define MPI_Type_get_name           PMPI_Type_get_name
#define MPI_Type_get_true_extent    PMPI_Type_get_true_extent
#define MPI_Type_hindexed           PMPI_Type_hindexed 
#define MPI_Type_hvector            PMPI_Type_hvector 
#define MPI_Type_indexed            PMPI_Type_indexed 
#define MPI_Type_lb                 PMPI_Type_lb 
#define MPI_Type_set_attr           PMPI_Type_set_attr 
#define MPI_Type_set_name           PMPI_Type_set_name
#define MPI_Type_size               PMPI_Type_size 
#define MPI_Type_struct             PMPI_Type_struct 
#define MPI_Type_ub                 PMPI_Type_ub 
#define MPI_Type_vector             PMPI_Type_vector 
#define MPI_Unpack                  PMPI_Unpack 
#define MPI_Unpublish_name          PMPI_Unpublish_name
#define MPI_Wait              PMPI_Wait 
#define MPI_Waitall                 PMPI_Waitall 
#define MPI_Waitany                 PMPI_Waitany 
#define MPI_Waitsome                PMPI_Waitsome 
#define MPI_Win_c2f                 PMPI_Win_c2f
#define MPI_Win_call_errhandler           PMPI_Win_call_errhandler
#define MPI_Win_complete            PMPI_Win_complete
#define MPI_Win_create              PMPI_Win_create
#define MPI_Win_create_errhandler   PMPI_Win_create_errhandler
#define MPI_Win_create_keyval       PMPI_Win_create_keyval
#define MPI_Win_delete_attr         PMPI_Win_delete_attr 
#define MPI_Win_f2c                 PMPI_Win_f2c
#define MPI_Win_fence               PMPI_Win_fence 
#define MPI_Win_free                PMPI_Win_free 
#define MPI_Win_free_keyval         PMPI_Win_free_keyval
#define MPI_Win_get_attr            PMPI_Win_get_attr 
#define MPI_Win_get_errhandler            PMPI_Win_get_errhandler
#define MPI_Win_get_group           PMPI_Win_get_group 
#define MPI_Win_get_name            PMPI_Win_get_name 
#define MPI_Win_lock                PMPI_Win_lock 
#define MPI_Win_post                PMPI_Win_post
#define MPI_Win_set_attr            PMPI_Win_set_attr 
#define MPI_Win_set_errhandler            PMPI_Win_set_errhandler
#define MPI_Win_set_name            PMPI_Win_set_name 
#define MPI_Win_start               PMPI_Win_start
#define MPI_Win_test                PMPI_Win_test
#define MPI_Win_unlock              PMPI_Win_unlock
#define MPI_Win_wait                PMPI_Win_wait
#define MPI_Wtick             PMPI_Wtick 
#define MPI_Wtime             PMPI_Wtime 

#endif      /* LAM_PROFILELIB */

#ifdef __cplusplus
extern "C" {
#endif

extern void lam_band __ARGS((void *, void *, int *, MPI_Datatype *));
extern void lam_bkerr __ARGS((int, int *, int *, int *));
extern void lam_bor __ARGS((void *, void *, int *, MPI_Datatype *));
extern int  lam_bottom_dtsnd __ARGS((void *, int, MPI_Datatype,
                           void *, int, MPI_Datatype, int, MPI_Comm));
extern int  lam_bottom_dtrcv __ARGS((void *, int, MPI_Datatype,
                        void *, int, MPI_Datatype, int, MPI_Comm));
extern int  lam_bufattach __ARGS((void *, int));
extern int  lam_bufdetach __ARGS((void *, int *));
extern int  lam_buffreebsend_ __ARGS((MPI_Request));
extern int  lam_bufinit __ARGS((MPI_Request));
extern int  lam_bufinitbsend_ __ARGS((MPI_Request));
extern void lam_bxor __ARGS((void *, void *, int *, MPI_Datatype *));
extern int  lam_chkarg __ARGS((void *, int, MPI_Datatype,
                        int, int, MPI_Comm));
extern int  lam_clocksync __ARGS((int, struct _gps *, float8 *));
extern int  lam_coll2pt __ARGS((int));
extern int  lam_mpi_coll2pt __ARGS((int));
extern void lam_commfault __ARGS((int));
extern void lam_comm_errfatal __ARGS((MPI_Comm *, int *, ...));
extern int  lam_comm_free __ARGS((MPI_Comm));
extern int  lam_comm_new __ARGS((int, MPI_Group, MPI_Group,
                        int, MPI_Comm *));
extern int  lam_coll_alloc_inter_cid __ARGS((MPI_Comm, int, 
                                     MPI_Comm, int,
                                     int, int, int *));
extern int  lam_coll_alloc_intra_cid __ARGS((MPI_Comm, int, int, int *));
extern int  lam_cubedim __ARGS((int));
extern int  lam_delkey __ARGS((HASH *, int));
extern void lam_dtalign __ARGS((MPI_Datatype));
extern void lam_dtblock __ARGS((MPI_Datatype, MPI_Datatype, int, int));
extern int  lam_dtbuffer __ARGS((MPI_Datatype, int, char **, char **));
extern void lam_dtcpy __ARGS((char *, char *, int, MPI_Datatype));
extern int  lam_dtsndrcv __ARGS((void *, int, MPI_Datatype,
                        void *, int, MPI_Datatype, int, MPI_Comm));
extern void lam_emptystat __ARGS((MPI_Status *));
extern int  lam_err_comm __ARGS((MPI_Comm, int, int, char *));
extern int  lam_err_win __ARGS((MPI_Win, int, int, char *));
extern int  lam_errfunc __ARGS((MPI_Comm, int, int));
extern void lam_errreturn __ARGS((void *, int *, ...));
extern int      lam_exchange_endian_info(struct _proc **procs, int numprocs);
extern int  lam_finalized __ARGS((void));
extern int  lam_freekey __ARGS((int, int));
extern void lam_free_onesided __ARGS((void));
extern int      lam_get_mpi_world __ARGS((int4 world_n, struct _gps *world, 
                                struct _gps *mpiworld,
                                char *prefix));
extern int      lam_match_ssi_modules __ARGS((int4 world_n, struct _gps *world, 
                                              char *prefix));
extern struct _attrkey *lam_getattr __ARGS((int));
extern int  lam_getcid __ARGS((void));
extern int  lam_getfunc __ARGS((void));
extern int  lam_numfuncs __ARGS((void));
extern struct _attr *lam_getkey __ARGS((HASH *, int));
extern void lam_getparam __ARGS((int *, int*));
extern int  lam_getpublished  __ARGS((char *, char **));
extern int  lam_hibit __ARGS((int, int));
#if LAM_WANT_IMPI
extern int  lam_impicoll2pt __ARGS((int));
extern int  lam_mpi_impicoll2pt __ARGS((int));
#endif
extern int  lam_inited __ARGS((void));
extern void lam_initerr __ARGS((void));
extern int  lam_initfault __ARGS((void));
extern int  lam_init_cid __ARGS((void));
extern int      lam_init_comm_world __ARGS((struct _gps *mpi_procs, 
                                  int mpi_nprocs));
extern int  lam_init_onesided __ARGS((void));
extern int  lam_int_pos __ARGS((void));
extern int  lam_irecv __ARGS((void *, int, MPI_Datatype, int,
                        int, MPI_Comm, MPI_Request *));
extern int  lam_isend __ARGS((void *, int, MPI_Datatype, int,
                        int, MPI_Comm, MPI_Request *, int));
extern int      lam_get_proc_array __ARGS((struct _gps **, int *, int *, 
                                 int *, int));
extern int  lam_keyval_create __ARGS((lam_void_fn_t, lam_void_fn_t,
                                          int *, void *, int));
extern void lam_land __ARGS((void *, void *, int *, MPI_Datatype *));
extern int  lam_linit __ARGS((int, char **, char *, int *, int *, int *, 
                        struct _gps **, int *));
extern void lam_lor __ARGS((void *, void *, int *, MPI_Datatype *));
extern void lam_lxor __ARGS((void *, void *, int *, MPI_Datatype *));
extern void lam_max __ARGS((void *, void *, int *, MPI_Datatype *));
extern void lam_maxloc __ARGS((void *, void *, int *, MPI_Datatype *));
extern void lam_min __ARGS((void *, void *, int *, MPI_Datatype *));
extern void lam_minloc __ARGS((void *, void *, int *, MPI_Datatype *));
extern void lam_replace __ARGS((void *, void *, int *, MPI_Datatype *));
extern void lam_mkcoll __ARGS((MPI_Comm));
extern void lam_mpi_mkcoll __ARGS((MPI_Comm));
extern int  lam_mkerr __ARGS((int, int));
#if LAM_WANT_IMPI
extern void     lam_mkimpicoll __ARGS((MPI_Comm comm));
extern void     lam_mpi_mkimpicoll __ARGS((MPI_Comm comm));
#endif
extern int  lam_mkkey __ARGS((void));
extern void lam_mkpt __ARGS((MPI_Comm));
extern void lam_mpi_mkpt __ARGS((MPI_Comm));
extern int      lam_mpi_init(int *pargc, char ***pargv, int requested, 
                       int *pprovided, int blk);
extern void lam_mpi_reset_sighandlers  __ARGS((void));
extern int  lam_mpi_set_sighandlers  __ARGS((void));
extern struct _proc *lam_nextproc __ARGS((void));
extern int      lam_nbarrier(struct _proc **procs, int nprocs);
extern int  lam_nprocs __ARGS((void));
extern void lam_nukecids __ARGS((void));
extern void lam_nukefunc __ARGS((void));
extern void lam_nukekeys __ARGS((void));
extern void lam_nukeprocs __ARGS((void));
extern void lam_nukepublished __ARGS((void));
extern void lam_nuketrace __ARGS((void));
extern int  lam_osd_blkadv __ARGS((MPI_Win));
extern int  lam_osd_complete __ARGS((MPI_Win, int));
extern int  lam_osd_fillheader __ARGS((int, int, MPI_Aint, int,
                              MPI_Datatype, struct _osdhdr *));
extern int  lam_osd_handler __ARGS((MPI_Request));
extern int  lam_osd_push __ARGS((void));
extern int  lam_osd_recv __ARGS((void *, int, MPI_Datatype, int, int,
                        MPI_Comm, int));
extern int  lam_osd_send __ARGS((void *, int, MPI_Datatype, int, int,
                        MPI_Comm, int, int));
extern int  lam_pack __ARGS((char *, int, MPI_Datatype, char *, int));
extern int  lam_ports_init __ARGS((void));
extern void lam_ports_free __ARGS((void));
extern int  lam_port_close __ARGS((int));
extern int  lam_port_is_open __ARGS((int));
extern int  lam_port_open __ARGS((void));
extern struct _proc *lam_procadd __ARGS((struct _gps *));
extern int  lam_proccmp __ARGS((struct _proc *, struct _proc *));
extern void     lam_procsort(struct _proc **procs, int nprocs);
extern struct _proc *lam_procfind __ARGS((struct _gps *));
extern int  lam_procfree __ARGS((struct _proc *));
extern int  lam_procrm __ARGS((struct _proc *));
extern void lam_prod __ARGS((void *, void *, int *, MPI_Datatype *));
extern int  lam_pt2coll __ARGS((int));
extern int  lam_mpi_pt2coll __ARGS((int));
#if LAM_WANT_IMPI
extern int  lam_pt2impicoll __ARGS((int));
extern int  lam_mpi_pt2impicoll __ARGS((int));
extern int      lam_pt2impidatasync __ARGS((int));
extern int      lam_mpi_pt2impidatasync __ARGS((int));
extern int      lam_pt2impisyncack __ARGS((int));
extern int      lam_mpi_pt2impisyncack __ARGS((int));
#endif
extern int  lam_publish __ARGS((char *, char *));
extern int  lam_putkey __ARGS((HASH **, int));
extern int  lam_rank_in_group __ARGS((MPI_Group, struct _proc *));
extern int  lam_mpi_rank_in_group __ARGS((MPI_Group, struct _proc *));
extern int  lam_recv __ARGS((void *, int, MPI_Datatype, int,
                        int, MPI_Comm, MPI_Status *));
extern void lam_resetfunc __ARGS((int));
extern void lam_rmcid __ARGS((int));
extern int  lam_send __ARGS((void *, int, MPI_Datatype, int, int,
                        MPI_Comm, int));
extern void lam_setcid __ARGS((int));
extern void lam_setfunc __ARGS((int));
extern void lam_setparam __ARGS((int, int, int));
extern void lam_sum __ARGS((void *, void *, int *, MPI_Datatype *));
extern int  lam_test __ARGS((MPI_Request *, int, int *, MPI_Status *));
extern struct _proc *lam_topproc __ARGS((void));
extern void lam_tr_cffend __ARGS((int, int, MPI_Comm,
                        MPI_Datatype, int));
extern void lam_tr_cffstart __ARGS((int));
extern int  lam_tr_comm __ARGS((MPI_Comm));
extern int  lam_tr_dtype __ARGS((MPI_Datatype));
extern void lam_tr_dtypefree __ARGS((MPI_Datatype));
extern int  lam_tr_incff __ARGS((void));
extern int  lam_tr_init __ARGS((char *, float8));
extern void lam_tr_msg __ARGS((int, double, int, int, int, int,
                  MPI_Comm, MPI_Datatype, int, int, int, int, int));
extern int  lam_tr_off __ARGS((void));
extern int  lam_tr_on __ARGS((void));
extern void lam_tr_startall __ARGS((int, MPI_Request *, double,
                        double, double));
extern void lam_tr_sub __ARGS((int, double, int));
extern double     lam_tr_timer __ARGS((void));
extern void lam_tr_wrapend __ARGS((int));
extern int  lam_tr_wrapstart __ARGS((int));
extern int      lam_tr_buoy __ARGS((const char *, double));
extern int      lam_tr_coloron __ARGS((int, int, int, double));
extern int      lam_tr_coloroff __ARGS((double));
extern int      lam_tr_commname __ARGS((char *, int, double));
extern void     *lam_tv_load_type_defs(void);
extern int  lam_type_free __ARGS((MPI_Datatype));
extern void lam_type_setdefaults __ARGS((MPI_Datatype));
extern int  lam_unpack __ARGS((char *, int, char *, int, MPI_Datatype));
extern int  lam_unpublish __ARGS((char *));
extern int      lam_updown_init __ARGS((void));
extern int      lam_updown_finalize __ARGS((void));
extern int      lam_updown_reset_thr_level __ARGS((void));
extern void lam_unsyncsql __ARGS((int, int, int *, int *,
                              int *, int *, int *, int *));
extern void lam_mpi_unsyncsql __ARGS((int, int, int *, int *,
                                          int *, int *, int *, int *));
extern void lam_win_errfatal __ARGS((MPI_Win *, int *, ...));
extern void lam_yield __ARGS((void));

extern void _m2l_ack __ARGS((struct nmsg *));
extern void _m2l_fill __ARGS((struct _proc *, struct _proc *, int, int,
                        struct nmsg *));
extern void _m2l_fillsys __ARGS((int4, int4, int4, int4, int, int,
                        struct nmsg *));
extern struct _proc *_m2l_getsource __ARGS((struct nmsg *));
extern int  _m2l_gettag __ARGS((struct nmsg *));
extern void _m2l_tail __ARGS((struct nmsg *));
extern void _mpi_req_add __ARGS((MPI_Request));
extern int  _mpi_req_advance __ARGS((void));
extern void _mpi_req_blkclr __ARGS((void));
extern void _mpi_req_blkset __ARGS((MPI_Request));
extern int  _mpi_req_build __ARGS((void *, int, MPI_Datatype, int, int,
                        MPI_Comm, int, MPI_Request *));
extern int  _mpi_req_destroy __ARGS((MPI_Request *));
extern int  _mpi_req_end __ARGS((MPI_Request));
extern void _mpi_req_get __ARGS((int, MPI_Request *));
extern int  _mpi_req_getn __ARGS((void));
extern void _mpi_req_rem __ARGS((MPI_Request));
extern int  _mpi_req_start __ARGS((MPI_Request));
extern int  _rpi_c2c_addprocs __ARGS((void));
extern int  _rpi_c2c_advance __ARGS((MPI_Request, int));
extern int  _rpi_c2c_build __ARGS((MPI_Request));
extern int  _rpi_c2c_destroy __ARGS((MPI_Request));
extern int  _rpi_c2c_finalize __ARGS((struct _proc *));
extern char       *_rpi_c2c_get_name __ARGS((void));
extern int  _rpi_c2c_init __ARGS((void));
extern int  _rpi_c2c_iprobe __ARGS((MPI_Request));
extern int  _rpi_c2c_start __ARGS((MPI_Request, MPI_Request));
extern int  _rpi_lamd_addprocs __ARGS((void));
extern int  _rpi_lamd_advance __ARGS((MPI_Request, int));
extern int  _rpi_lamd_build __ARGS((MPI_Request));
extern int  _rpi_lamd_destroy __ARGS((MPI_Request));
extern int  _rpi_lamd_finalize __ARGS((struct _proc *));
extern int  _rpi_lamd_init __ARGS((void));
extern int  _rpi_lamd_iprobe __ARGS((MPI_Request));
extern int  _rpi_lamd_start __ARGS((MPI_Request, MPI_Request));
extern int  _rpi_c2c_fastsend __ARGS((char *, int, MPI_Datatype,
                              int, int, MPI_Comm));
extern int  _rpi_c2c_fastrecv __ARGS((char *, int, MPI_Datatype, int,
                              int *, MPI_Comm, MPI_Status *, int *));
extern int  _rpi_c2c_alloc_mem __ARGS((MPI_Aint size, MPI_Info info,
                                 void *baseptr));
extern int  _rpi_c2c_free_mem __ARGS((void *base));

#ifdef __cplusplus
}
#endif

/*
 * Fortran support
 */

#define LAM_MAXF77PREDEF      55    /* max # predef. F77 handles */
#define LAM_TYPETBLSIZE       256         /* initial handle table size */

/*
 * external variables
 */
extern int        lam_F_maxhdl;
extern int        lam_F_nhdl;
extern int        lam_F_sizehdlarray;
extern void       **lam_F_handles;
extern char       *lam_F_bottom;
extern void       *lam_F_argvnull;
extern void       *lam_F_argvsnull;
extern void       *lam_F_errorcodes_ignore;
extern void       *lam_F_status_ignore;
extern void       *lam_F_statuses_ignore;

/*
 * prototypes of LAM MPI library F77 internal functions
 */
#ifdef __cplusplus
extern "C" {
#endif

extern char       *lam_F2C_string __ARGS((char *, int));
extern int        lam_F2C_argv __ARGS((char *, int, char ***));
extern void       lam_F2C_stat __ARGS((int *, MPI_Status *));
extern void       lam_C2F_stat __ARGS((MPI_Status *, int *));
extern void       lam_C2F_string __ARGS((char *, char *, int));
extern int        lam_F_alloc_hdl __ARGS((void));
extern int        lam_F_find_hdl __ARGS((void *));
extern int        lam_F_make_hdl __ARGS((int *, int *, void *, int));
extern void       lam_F_free_hdl __ARGS((int));

#ifdef __cplusplus
}
#endif

#endif      /* _MPISYS_H */

Generated by  Doxygen 1.6.0   Back to index