/* * 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 #include #include #include #include #include #include #include #include #include #include #include #include /* * 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 */