Added MPI wrapper function for 'MPI_Init_thread'
This commit was SVN r20912.
Этот коммит содержится в:
родитель
c5b1bdd57c
Коммит
fa3cf2d2ba
@ -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.h>],
|
||||
[
|
||||
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
|
||||
])
|
||||
|
||||
|
||||
|
@ -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) ) {
|
||||
|
@ -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] =
|
||||
|
@ -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];
|
||||
|
||||
|
@ -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()
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user