.. _mpi_finalize: MPI_Finalize ============ .. include_body :ref:`MPI_Finalize` |mdash| Terminates MPI execution environment. SYNTAX ------ C Syntax ^^^^^^^^ .. code-block:: c #include int MPI_Finalize() Fortran Syntax ^^^^^^^^^^^^^^ .. code-block:: fortran USE MPI ! or the older form: INCLUDE 'mpif.h' MPI_FINALIZE(IERROR) INTEGER IERROR Fortran 2008 Syntax ^^^^^^^^^^^^^^^^^^^ .. code-block:: fortran USE mpi_f08 MPI_Finalize(ierror) INTEGER, OPTIONAL, INTENT(OUT) :: ierror OUTPUT PARAMETER ---------------- * ``ierror`` : Fortran only: Error status (integer). DESCRIPTION ----------- This routine cleans up all MPI states. Once this routine is called, no MPI routine (not even MPI_Init) may be called, except for :ref:`MPI_Get_version`, :ref:`MPI_Initialized`, and :ref:`MPI_Finalized`. Unless there has been a call to :ref:`MPI_Abort`, you must ensure that all pending communications involving a process are complete before the process calls :ref:`MPI_Finalize`. If the call returns, each process may either continue local computations or exit without participating in further communication with other processes. At the moment when the last process calls :ref:`MPI_Finalize`, all pending sends must be matched by a receive, and all pending receives must be matched by a send. :ref:`MPI_Finalize` is collective over all connected processes. If no processes were spawned, accepted, or connected, then this means it is collective over MPI_COMM_WORLD. Otherwise, it is collective over the union of all processes that have been and continue to be connected. NOTES ----- All processes must call this routine before exiting. All processes will still exist but may not make any further MPI calls. :ref:`MPI_Finalize` guarantees that all local actions required by communications the user has completed will, in fact, occur before it returns. However, :ref:`MPI_Finalize` guarantees nothing about pending communications that have not been completed; completion is ensured only by :ref:`MPI_Wait`, :ref:`MPI_Test`, or :ref:`MPI_Request_free` combined with some other verification of completion. For example, a successful return from a blocking communication operation or from :ref:`MPI_Wait` or :ref:`MPI_Test` means that the communication is completed by the user and the buffer can be reused, but does not guarantee that the local process has no more work to do. Similarly, a successful return from :ref:`MPI_Request_free` with a request handle generated by an :ref:`MPI_Isend` nullifies the handle but does not guarantee that the operation has completed. The :ref:`MPI_Isend` is complete only when a matching receive has completed. If you would like to cause actions to happen when a process finishes, attach an attribute to MPI_COMM_SELF with a callback function. Then, when :ref:`MPI_Finalize` is called, it will first execute the equivalent of an :ref:`MPI_Comm_free` on MPI_COMM_SELF. This will cause the delete callback function to be executed on all keys associated with MPI_COMM_SELF in an arbitrary order. If no key has been attached to MPI_COMM_SELF, then no callback is invoked. This freeing of MPI_COMM_SELF happens before any other parts of MPI are affected. Calling :ref:`MPI_Finalized` will thus return "false" in any of these callback functions. Once you have done this with MPI_COMM_SELF, the results of :ref:`MPI_Finalize` are not specified. ERRORS ------ .. include:: ./ERRORS.rst .. seealso:: :ref:`MPI_Init`