diff --git a/ompi/contrib/vt/vt/acinclude.m4 b/ompi/contrib/vt/vt/acinclude.m4 index 8860a42da1..946189c788 100644 --- a/ompi/contrib/vt/vt/acinclude.m4 +++ b/ompi/contrib/vt/vt/acinclude.m4 @@ -958,6 +958,7 @@ AC_DEFUN([ACVT_MPI], [ mpi_error="no" mpi_status_size= + have_mpithrd= have_mpio= MPIDIR= @@ -1007,6 +1008,11 @@ AC_DEFUN([ACVT_MPI], [mpi_status_size=$withval]) ]) + AC_ARG_ENABLE(mpi-thread, + AC_HELP_STRING(--enable-mpi-thread, + [MPI supports threads, default: yes if found by configure]), + [AS_IF([test x"$enableval" = "xyes"], [have_mpithrd=yes], [have_mpithrd=no])]) + AC_ARG_ENABLE(mpi-io, AC_HELP_STRING(--enable-mpi-io, [MPI supports file access, default: yes if found by configure]), @@ -1054,6 +1060,7 @@ AC_DEFUN([ACVT_MPI], AS_IF([test x"$MPILIB" = x], [MPILIB="-lmpi"]) AS_IF([test x"$PMPILIB" = x], [PMPILIB="$MPILIB"]) AS_IF([test x"$FMPILIB" = x], [FMPILIB="-lvt.fmpi"]) + have_mpithrd="yes" build_fmpi="yes" ]) AC_ARG_WITH(hpmpi, @@ -1340,35 +1347,38 @@ int main () { ]) ]) -dnl check for MPI I/O support - AS_IF([test "$mpi_error" = "no"], [ + sav_CC=$CC + sav_CFLAGS=$CFLAGS + sav_LIBS=$LIBS + CC=$MPICC + CFLAGS="$CFLAGS $MPIINCDIR" + LIBS="$LIBS $MPILIBDIR $MPILIB" + +dnl check for MPI Thread support + + AS_IF([test x"$have_mpithrd" = x], + [ + AC_CHECK_FUNC([MPI_Init_thread], + [have_mpithrd="yes"], [have_mpithrd="no"]) + ]) + AS_IF([test "$have_mpithrd" = "yes"], + [AC_DEFINE([HAVE_MPITHRD], [1], [Define to 1 if MPI supports threads.])]) + +dnl check for MPI I/O + AS_IF([test x"$have_mpio" = x], [ - AC_MSG_CHECKING([whether MPI supports file access]) - - sav_CC=$CC - sav_CFLAGS=$CFLAGS - sav_LIBS=$LIBS - CC=$MPICC - CFLAGS="$CFLAGS $MPIINCDIR" - LIBS="$LIBS $MPILIBDIR $MPILIB" - AC_TRY_LINK([#include ], -[ - MPI_File fh; - MPI_File_close(&fh); -], [have_mpio=yes], [have_mpio=no]) - - CC=$sav_CC - CFLAGS=$sav_CFLAGS - LIBS=$sav_LIBS - - AC_MSG_RESULT([$have_mpio]) + AC_CHECK_FUNC([MPI_File_open], + [have_mpio="yes"], [have_mpio="no"]) ]) - AS_IF([test "$have_mpio" = "yes"], [AC_DEFINE([HAVE_MPIO], [1], [Define to 1 if MPI supports file access.])]) + + CC=$sav_CC + CFLAGS=$sav_CFLAGS + LIBS=$sav_LIBS ]) diff --git a/ompi/contrib/vt/vt/vtlib/vt_fmpiwrap.c b/ompi/contrib/vt/vt/vtlib/vt_fmpiwrap.c index 4fbff11f73..e2d7c02271 100644 --- a/ompi/contrib/vt/vt/vtlib/vt_fmpiwrap.c +++ b/ompi/contrib/vt/vt/vtlib/vt_fmpiwrap.c @@ -37,6 +37,20 @@ DEF_FMPI_FUNC( vt_mpi_init_f(MPI_Fint* ierr) ) { (MPI_Fint* ierr), (ierr)) +#if defined(HAVE_MPITHRD) && HAVE_MPITHRD + +/* -- MPI_Init_thread -- */ + +DEF_FMPI_FUNC( vt_mpi_init_thread_f(MPI_Fint* required, MPI_Fint* provided, + MPI_Fint* ierr) ) { + *ierr = MPI_Init_thread(0, (char***)0, *required, provided); +} VT_GENERATE_F77_BINDINGS(mpi_init_thread, MPI_INIT_THREAD, + vt_mpi_init_thread_f, + (MPI_Fint* required, MPI_Fint* provided, MPI_Fint* ierr), + (required, provided, ierr)) + +#endif /* HAVE_MPITHRD */ + /* -- MPI_Finalize -- */ DEF_FMPI_FUNC( vt_mpi_finalize_f(MPI_Fint* ierr) ) { @@ -1158,6 +1172,20 @@ DEF_FMPI_FUNC( vt_mpi_init_f(MPI_Fint* ierr) ) { (MPI_Fint* ierr), (ierr)) +#if defined(HAVE_MPITHRD) && HAVE_MPITHRD + +/* -- MPI_Init_thread -- */ + +DEF_FMPI_FUNC( vt_mpi_init_thread_f(MPI_Fint* required, MPI_Fint* provided, + MPI_Fint* ierr) ) { + *ierr = MPI_Init_thread(0, (char***)0, *required, provided); +} VT_GENERATE_F77_BINDINGS(mpi_init_thread, MPI_INIT_THREAD, + vt_mpi_init_thread_f, + (MPI_Fint* required, MPI_Fint* provided, MPI_Fint* ierr), + (required, provided, ierr)) + +#endif /* HAVE_MPITHRD */ + /* -- MPI_Finalize -- */ DEF_FMPI_FUNC( vt_mpi_finalize_f(MPI_Fint* ierr) ) { diff --git a/ompi/contrib/vt/vt/vtlib/vt_mpireg.c b/ompi/contrib/vt/vt/vtlib/vt_mpireg.c index 55ce700135..9a78bf5a14 100644 --- a/ompi/contrib/vt/vt/vtlib/vt_mpireg.c +++ b/ompi/contrib/vt/vt/vtlib/vt_mpireg.c @@ -234,6 +234,8 @@ void vt_mpi_register() vt_def_region("MPI_Ibsend", fid, VT_NO_LNO, VT_NO_LNO, "MPI", VT_FUNCTION); vt_mpi_regid[VT__MPI_INIT] = vt_def_region("MPI_Init", fid, VT_NO_LNO, VT_NO_LNO, "MPI", VT_FUNCTION); + vt_mpi_regid[VT__MPI_INIT_THREAD] = + vt_def_region("MPI_Init_thread", fid, VT_NO_LNO, VT_NO_LNO, "MPI", VT_FUNCTION); vt_mpi_regid[VT__MPI_INITIALIZED] = vt_def_region("MPI_Initialized", fid, VT_NO_LNO, VT_NO_LNO, "MPI", VT_FUNCTION); vt_mpi_regid[VT__MPI_INTERCOMM_CREATE] = diff --git a/ompi/contrib/vt/vt/vtlib/vt_mpireg.h b/ompi/contrib/vt/vt/vtlib/vt_mpireg.h index 770207f2cd..27e1f70e62 100644 --- a/ompi/contrib/vt/vt/vtlib/vt_mpireg.h +++ b/ompi/contrib/vt/vt/vtlib/vt_mpireg.h @@ -123,82 +123,83 @@ #define VT__MPI_GROUP_UNION 101 #define VT__MPI_IBSEND 102 #define VT__MPI_INIT 103 -#define VT__MPI_INITIALIZED 104 -#define VT__MPI_INTERCOMM_CREATE 105 -#define VT__MPI_INTERCOMM_MERGE 106 -#define VT__MPI_IPROBE 107 -#define VT__MPI_IRECV 108 -#define VT__MPI_IRSEND 109 -#define VT__MPI_ISEND 110 -#define VT__MPI_ISSEND 111 -#define VT__MPI_KEYVAL_CREATE 112 -#define VT__MPI_KEYVAL_FREE 113 -#define VT__MPI_OP_CREATE 114 -#define VT__MPI_OP_FREE 115 -#define VT__MPI_PACK 116 -#define VT__MPI_PACK_SIZE 117 -#define VT__MPI_PCONTROL 118 -#define VT__MPI_PROBE 119 -#define VT__MPI_RECV 120 -#define VT__MPI_RECV_INIT 121 -#define VT__MPI_REDUCE 122 -#define VT__MPI_REDUCE_SCATTER 123 -#define VT__MPI_REQUEST_FREE 124 -#define VT__MPI_RSEND 125 -#define VT__MPI_RSEND_INIT 126 -#define VT__MPI_SCAN 127 -#define VT__MPI_SCATTER 128 -#define VT__MPI_SCATTERV 129 -#define VT__MPI_SEND 130 -#define VT__MPI_SEND_INIT 131 -#define VT__MPI_SENDRECV 132 -#define VT__MPI_SENDRECV_REPLACE 133 -#define VT__MPI_SSEND 134 -#define VT__MPI_SSEND_INIT 135 -#define VT__MPI_START 136 -#define VT__MPI_STARTALL 137 -#define VT__MPI_TEST 138 -#define VT__MPI_TEST_CANCELLED 139 -#define VT__MPI_TESTALL 140 -#define VT__MPI_TESTANY 141 -#define VT__MPI_TESTSOME 142 -#define VT__MPI_TOPO_TEST 143 -#define VT__MPI_TYPE_COMMIT 144 -#define VT__MPI_TYPE_CONTIGUOUS 145 -#define VT__MPI_TYPE_EXTENT 146 -#define VT__MPI_TYPE_FREE 147 -#define VT__MPI_TYPE_HINDEXED 148 -#define VT__MPI_TYPE_HVECTOR 149 -#define VT__MPI_TYPE_INDEXED 150 -#define VT__MPI_TYPE_LB 151 -#define VT__MPI_TYPE_SIZE 152 -#define VT__MPI_TYPE_STRUCT 153 -#define VT__MPI_TYPE_UB 154 -#define VT__MPI_TYPE_VECTOR 155 -#define VT__MPI_UNPACK 156 -#define VT__MPI_WAIT 157 -#define VT__MPI_WAITALL 158 -#define VT__MPI_WAITANY 159 -#define VT__MPI_WAITSOME 160 -#define VT__MPI_WTICK 161 -#define VT__MPI_WTIME 162 -#define VT__MPI_ACCUMULATE 163 -#define VT__MPI_GET 164 -#define VT__MPI_PUT 165 -#define VT__MPI_WIN_COMPLETE 166 -#define VT__MPI_WIN_CREATE 167 -#define VT__MPI_WIN_FENCE 168 -#define VT__MPI_WIN_FREE 169 -#define VT__MPI_WIN_GET_GROUP 170 -#define VT__MPI_WIN_LOCK 171 -#define VT__MPI_WIN_POST 172 -#define VT__MPI_WIN_START 173 -#define VT__MPI_WIN_TEST 174 -#define VT__MPI_WIN_UNLOCK 175 -#define VT__MPI_WIN_WAIT 176 -#define VT__MPI_ALLTOALLW 177 -#define VT__MPI_EXSCAN 178 -#define VT__MPI_REGID_NUM 179 +#define VT__MPI_INIT_THREAD 104 +#define VT__MPI_INITIALIZED 105 +#define VT__MPI_INTERCOMM_CREATE 106 +#define VT__MPI_INTERCOMM_MERGE 107 +#define VT__MPI_IPROBE 108 +#define VT__MPI_IRECV 109 +#define VT__MPI_IRSEND 110 +#define VT__MPI_ISEND 111 +#define VT__MPI_ISSEND 112 +#define VT__MPI_KEYVAL_CREATE 113 +#define VT__MPI_KEYVAL_FREE 114 +#define VT__MPI_OP_CREATE 115 +#define VT__MPI_OP_FREE 116 +#define VT__MPI_PACK 117 +#define VT__MPI_PACK_SIZE 118 +#define VT__MPI_PCONTROL 119 +#define VT__MPI_PROBE 120 +#define VT__MPI_RECV 121 +#define VT__MPI_RECV_INIT 122 +#define VT__MPI_REDUCE 123 +#define VT__MPI_REDUCE_SCATTER 124 +#define VT__MPI_REQUEST_FREE 125 +#define VT__MPI_RSEND 126 +#define VT__MPI_RSEND_INIT 127 +#define VT__MPI_SCAN 128 +#define VT__MPI_SCATTER 129 +#define VT__MPI_SCATTERV 130 +#define VT__MPI_SEND 131 +#define VT__MPI_SEND_INIT 132 +#define VT__MPI_SENDRECV 133 +#define VT__MPI_SENDRECV_REPLACE 134 +#define VT__MPI_SSEND 135 +#define VT__MPI_SSEND_INIT 136 +#define VT__MPI_START 137 +#define VT__MPI_STARTALL 138 +#define VT__MPI_TEST 139 +#define VT__MPI_TEST_CANCELLED 140 +#define VT__MPI_TESTALL 141 +#define VT__MPI_TESTANY 142 +#define VT__MPI_TESTSOME 143 +#define VT__MPI_TOPO_TEST 144 +#define VT__MPI_TYPE_COMMIT 145 +#define VT__MPI_TYPE_CONTIGUOUS 146 +#define VT__MPI_TYPE_EXTENT 147 +#define VT__MPI_TYPE_FREE 148 +#define VT__MPI_TYPE_HINDEXED 149 +#define VT__MPI_TYPE_HVECTOR 150 +#define VT__MPI_TYPE_INDEXED 151 +#define VT__MPI_TYPE_LB 152 +#define VT__MPI_TYPE_SIZE 153 +#define VT__MPI_TYPE_STRUCT 154 +#define VT__MPI_TYPE_UB 155 +#define VT__MPI_TYPE_VECTOR 156 +#define VT__MPI_UNPACK 157 +#define VT__MPI_WAIT 158 +#define VT__MPI_WAITALL 159 +#define VT__MPI_WAITANY 160 +#define VT__MPI_WAITSOME 161 +#define VT__MPI_WTICK 162 +#define VT__MPI_WTIME 163 +#define VT__MPI_ACCUMULATE 164 +#define VT__MPI_GET 165 +#define VT__MPI_PUT 166 +#define VT__MPI_WIN_COMPLETE 167 +#define VT__MPI_WIN_CREATE 168 +#define VT__MPI_WIN_FENCE 169 +#define VT__MPI_WIN_FREE 170 +#define VT__MPI_WIN_GET_GROUP 171 +#define VT__MPI_WIN_LOCK 172 +#define VT__MPI_WIN_POST 173 +#define VT__MPI_WIN_START 174 +#define VT__MPI_WIN_TEST 175 +#define VT__MPI_WIN_UNLOCK 176 +#define VT__MPI_WIN_WAIT 177 +#define VT__MPI_ALLTOALLW 178 +#define VT__MPI_EXSCAN 179 +#define VT__MPI_REGID_NUM 180 extern int vt_mpi_regid[VT__MPI_REGID_NUM]; diff --git a/ompi/contrib/vt/vt/vtlib/vt_mpiwrap.c b/ompi/contrib/vt/vt/vtlib/vt_mpiwrap.c index d20003ffe7..cb047ffc7e 100644 --- a/ompi/contrib/vt/vt/vtlib/vt_mpiwrap.c +++ b/ompi/contrib/vt/vt/vtlib/vt_mpiwrap.c @@ -164,6 +164,124 @@ int MPI_Init( int *argc, char ***argv ) return returnVal; } +#if defined(HAVE_MPITHRD) && HAVE_MPITHRD + +/* -- MPI_Init_thread -- */ + +int MPI_Init_thread( int* argc, char*** argv, + int required, int* provided ) +{ + int returnVal, numprocs, me, i; + unsigned char* grpv; + uint32_t grpc; + uint64_t time; + + /* shall I trace MPI events? */ + vt_mpi_trace_is_on = vt_mpitrace = vt_env_mpitrace(); + + /* first event? + -> initialize VT and enter dummy function 'user' */ + if ( !vt_is_alive ) + { + vt_open(); + time = vt_pform_wtime(); + vt_enter_user(&time); + vt_enter_user_called = 1; + } + + if (IS_MPI_TRACE_ON) + { + MPI_TRACE_OFF(); + + time = vt_pform_wtime(); + vt_enter(&time, vt_mpi_regid[VT__MPI_INIT_THREAD]); + + returnVal = PMPI_Init_thread(argc, argv, required, provided); + + switch (required) + { + case MPI_THREAD_SINGLE: + case MPI_THREAD_FUNNELED: + break; + case MPI_THREAD_SERIALIZED: + case MPI_THREAD_MULTIPLE: + if (*provided == MPI_THREAD_SERIALIZED || + *provided == MPI_THREAD_MULTIPLE) + { + vt_error_msg("MPI thread support levels MPI_THREAD_SERIALIZED and " + "MPI_THREAD_MULTIPLE not yet supported"); + } + break; + default: + vt_error_msg("Unknown level of MPI thread support required"); + break; + } + + /* initialize mpi event handling */ + vt_mpi_init(); + + PMPI_Comm_size(MPI_COMM_WORLD, &numprocs); + PMPI_Comm_rank(MPI_COMM_WORLD, &me); + + grpc = numprocs / 8 + (numprocs % 8 ? 1 : 0); + + /* define communicator for MPI_COMM_WORLD */ + grpv = (unsigned char*)calloc(grpc, sizeof(unsigned char)); + for (i = 0; i < numprocs; i++) + grpv[i / 8] |= (1 << (i % 8)); + vt_def_mpi_comm(0, grpc, grpv); + + memset(grpv, 0, grpc); + + /* define communicator for MPI_COMM_SELF */ + grpv[me / 8] |= (1 << (me % 8)); + vt_def_mpi_comm(1, grpc, grpv); + + free(grpv); + + /* initialize communicator management */ + vt_comm_init(); + + time = vt_pform_wtime(); + vt_exit(&time); + + MPI_TRACE_ON(); + } + else + { + returnVal = PMPI_Init_thread(argc, argv, required, provided); + + /* initialize mpi event handling */ + vt_mpi_init(); + + PMPI_Comm_size(MPI_COMM_WORLD, &numprocs); + PMPI_Comm_rank(MPI_COMM_WORLD, &me); + + grpc = numprocs / 8 + (numprocs % 8 ? 1 : 0); + + /* define communicator for MPI_COMM_WORLD */ + grpv = (unsigned char*)calloc(grpc, sizeof(unsigned char)); + for (i = 0; i < numprocs; i++) + grpv[i / 8] |= (1 << (i % 8)); + vt_def_mpi_comm(0, grpc, grpv); + + memset(grpv, 0, grpc); + + /* define communicator for MPI_COMM_SELF */ + grpv[me / 8] |= (1 << (me % 8)); + vt_def_mpi_comm(1, grpc, grpv); + + free(grpv); + + /* initialize communicator management */ + vt_comm_init(); + } + + return returnVal; +} + +#endif /* HAVE_MPITHRD */ + /* -- MPI_Finalize -- */ int MPI_Finalize()