1
1

Added MPI wrapper function for 'MPI_Init_thread'

This commit was SVN r20912.
Этот коммит содержится в:
Matthias Jurenz 2009-04-01 07:52:14 +00:00
родитель c5b1bdd57c
Коммит fa3cf2d2ba
5 изменённых файлов: 257 добавлений и 98 удалений

Просмотреть файл

@ -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()