1
1

Fix for MPI_WTICK / MPI_WTIME F90 bindings issue. The previous hope

was that declaring the type of MPI_WTICK and MPI_TIME in mpif-common.h
would allow the F90 bindings to call through to the back end f77
function and have the right return type.  But upon reflection, that's
silly -- we were just declaring the variables MPI_WTICK and MPI_WTIME
that were of type double precision.  Duh.

So add some fixed (non-generated) wrapper F90 functions to call the
back-end *C* MPI_WTICK and MPI_TIME functions (vs. the back end *F77*
functions).  We have to call the back-end C functions because there's
a name conflict if we try to call the back-end F77 functions -- for
the same reasons that we can't "implicitly" define MPI_WTIME and
MPI_WTICK in the f90 module, we can't call such an implicitly-defined
function.  So we had to add new back-end C functions that are directly
callable from Fortran, the easiest implementation of which was to
provide 4 one-line functions for each (rather than muck around with
weak symbols).

This commit was SVN r10448.
Этот коммит содержится в:
Jeff Squyres 2006-06-21 13:44:20 +00:00
родитель 365c81d6e9
Коммит 720f38efc5
7 изменённых файлов: 142 добавлений и 7 удалений

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

@ -450,9 +450,3 @@
parameter (MPI_MAXLOC=11)
parameter (MPI_MINLOC=12)
parameter (MPI_REPLACE=13)
!
! double precision functions
!
double precision MPI_WTIME, MPI_WTICK , PMPI_WTICK, PMPI_WTIME

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

@ -75,3 +75,5 @@
! double precision functions
!
external MPI_WTIME, MPI_WTICK, PMPI_WTICK, PMPI_WTIME
double precision MPI_WTIME, MPI_WTICK, PMPI_WTICK, PMPI_WTIME

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

@ -64,6 +64,7 @@ headers = \
libmpi_f77_la_SOURCES = \
constants_f.c \
attr_fn_f.c \
f90_accessors.c \
strings.c \
test_constants_f.c

90
ompi/mpi/f77/f90_accessors.c Обычный файл
Просмотреть файл

@ -0,0 +1,90 @@
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "ompi_config.h"
#include "ompi/mpi/f77/bindings.h"
/* These functions solely exist so that the F90 bindings can call a C
function from Fortran, so we provide all 4 variants. Specifically,
the F90 bindings for MPI_WTICK and MPI_WTIME need to call the
back-end C functions to effect the functionality -- they cannot
call the back-end F77 functions because there is an overload of
names and types. So we create these new functions with different
names (MPI_WTICK_F90 and MPI_WTIME_F90 vs. MPI_WTICK and MPI_WTIME)
so that the F90 bindings can call these functions directly.
Rather than try to be clever with weak symbols, especially since
the function implementations are 1 line long, it just seemed
simpler to provide 4 copies of each [1 line] function. */
void MPI_WTIME_F90(double *w);
void mpi_wtime_f90(double *w);
void mpi_wtime_f90_(double *w);
void mpi_wtime_f90__(double *w);
void MPI_WTICK_F90(double *w);
void mpi_wtick_f90(double *w);
void mpi_wtick_f90_(double *w);
void mpi_wtick_f90__(double *w);
/**********************************************************************/
void MPI_WTIME_F90(double *w)
{
*w = MPI_Wtime();
}
void mpi_wtime_f90(double *w)
{
*w = MPI_Wtime();
}
void mpi_wtime_f90_(double *w)
{
*w = MPI_Wtime();
}
void mpi_wtime_f90__(double *w)
{
*w = MPI_Wtime();
}
/**********************************************************************/
void MPI_WTICK_F90(double *w)
{
*w = MPI_Wtick();
}
void mpi_wtick_f90(double *w)
{
*w = MPI_Wtick();
}
void mpi_wtick_f90_(double *w)
{
*w = MPI_Wtick();
}
void mpi_wtick_f90__(double *w)
{
*w = MPI_Wtick();
}

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

@ -165,7 +165,9 @@ small_sources = \
mpi_testall_f90.f90 \
mpi_testsome_f90.f90 \
mpi_waitall_f90.f90 \
mpi_waitsome_f90.f90
mpi_waitsome_f90.f90 \
mpi_wtick_f90.f90 \
mpi_wtime_f90.f90
medium_sources = \
mpi_address_f90.f90 \

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

@ -53,6 +53,29 @@ EOF
fi
}
# A few hard-coded functions that cannot pass through to the F77
# equivalents
start MPI_Wtick small
cat <<EOF
function MPI_Wtick()
double precision MPI_Wtick
end function MPI_Wtick
EOF
end MPI_Wtick
start MPI_Wtime small
cat <<EOF
function MPI_Wtime()
double precision MPI_Wtime
end function MPI_Wtime
EOF
end MPI_Wtime
#------------------------------------------------------------------------
output_1() {

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

@ -649,6 +649,29 @@ fi
output=1
allranks="0 $ranks"
# A few hard-coded functions that cannot pass through to the F77
# equivalents
start MPI_Wtick small
cat <<EOF
function MPI_Wtick()
double precision MPI_Wtick
end function MPI_Wtick
EOF
end MPI_Wtick
start MPI_Wtime small
cat <<EOF
function MPI_Wtime()
double precision MPI_Wtime
end function MPI_Wtime
EOF
end MPI_Wtime
#------------------------------------------------------------------------
# Helper functions