1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
.. _mpi_get_address:
MPI_Get_address
===============
.. include_body
:ref:`MPI_Get_address` |mdash| Gets the address of a location in memory.
SYNTAX
------
C Syntax
^^^^^^^^
.. code-block:: c
#include <mpi.h>
int MPI_Get_address(const void *location, MPI_Aint *address)
Fortran Syntax
^^^^^^^^^^^^^^
.. code-block:: fortran
USE MPI
! or the older form: INCLUDE 'mpif.h'
MPI_GET_ADDRESS(LOCATION, ADDRESS, IERROR)
<type> LOCATION(*)
INTEGER(KIND=MPI_ADDRESS_KIND) ADDRESS
INTEGER IERROR
Fortran 2008 Syntax
^^^^^^^^^^^^^^^^^^^
.. code-block:: fortran
USE mpi_f08
MPI_Get_address(location, address, ierror)
TYPE(*), DIMENSION(..), ASYNCHRONOUS :: location
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(OUT) :: address
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
INPUT PARAMETERS
----------------
* ``location`` : Location in caller memory (choice).
OUTPUT PARAMETERS
-----------------
* ``address`` : Address of location (integer).
* ``ierror`` : Fortran only: Error status (integer).
DESCRIPTION
-----------
:ref:`MPI_Get_address` returns the byte ``address`` of a location in
memory.
Example: Using :ref:`MPI_Get_address` for an array.
.. code-block:: fortran
REAL :: A(100,100)
INTEGER(MPI_ADDRESS_KIND) :: I1, I2, DIFF
CALL MPI_GET_ADDRESS(A(1,1), I1, IERROR)
CALL MPI_GET_ADDRESS(A(10,10), I2, IERROR)
DIFF = I2 - I1
! The value of DIFF is 909*sizeofreal; the values of I1 and I2 are
! implementation dependent.
NOTES
-----
This routine is provided for both Fortran and C programmers and may be
useful when writing portable code. In the current release, the address
returned by this routine will be the same as that produced by the C ``&``
operator.
C users may be tempted to avoid using :ref:`MPI_Get_address` and rely on the
availability of the address operator ``&``. Note, however, that &
cast-expression is a pointer, not an address. ANSI C does not require
that the value of a pointer (or the pointer cast to int) be the absolute
address of the object pointed at although this is commonly the case.
Furthermore, referencing may not have a unique definition on machines
with a segmented address space. The use of :ref:`MPI_Get_address` to "reference" C
variables guarantees portability to such machines as well.
Current Fortran MPI codes will run unmodified and will port to any
system. However, they may fail if ``addresses`` larger than 2^32 - 1 are
used in the program. New codes should be written so that they use the
new functions. This provides compatibility with C and avoids errors on
64-bit architectures. However, such newly written codes may need to be
(slightly) rewritten to port to old Fortran 77 environments that do not
support KIND declarations.
ERRORS
------
.. include:: ./ERRORS.rst
|