.. _mpi_testsome: MPI_Testsome ============ .. include_body :ref:`MPI_Testsome` |mdash| Tests for completion of one or more previously initiated communications in a list. SYNTAX ------ C Syntax ^^^^^^^^ .. code-block:: c #include int MPI_Testsome(int incount, MPI_Request array_of_requests[], int *outcount, int array_of_indices[], MPI_Status array_of_statuses[]) Fortran Syntax ^^^^^^^^^^^^^^ .. code-block:: fortran USE MPI ! or the older form: INCLUDE 'mpif.h' MPI_TESTSOME(INCOUNT, ARRAY_OF_REQUESTS, OUTCOUNT, ARRAY_OF_INDICES, ARRAY_OF_STATUSES, IERROR) INTEGER INCOUNT, ARRAY_OF_REQUESTS(*) INTEGER OUTCOUNT, ARRAY_OF_INDICES(*) INTEGER ARRAY_OF_STATUSES(MPI_STATUS_SIZE,*), IERROR Fortran 2008 Syntax ^^^^^^^^^^^^^^^^^^^ .. code-block:: fortran USE mpi_f08 MPI_Testsome(incount, array_of_requests, outcount, array_of_indices, array_of_statuses, ierror) INTEGER, INTENT(IN) :: incount TYPE(MPI_Request), INTENT(INOUT) :: array_of_requests(incount) INTEGER, INTENT(OUT) :: outcount, array_of_indices(*) TYPE(MPI_Status) :: array_of_statuses(*) INTEGER, OPTIONAL, INTENT(OUT) :: ierror INPUT PARAMETERS ---------------- * ``incount``: Length of array_of_requests (integer). * ``array_of_requests``: Array of requests (array of handles). OUTPUT PARAMETERS ----------------- * ``outcount``: Number of completed requests (integer). * ``array_of_indices``: Array of indices of operations that completed (array of integers). * ``array_of_statuses``: Array of status objects for operations that completed (array of status). * ``ierror``: Fortran only: Error status (integer). DESCRIPTION ----------- Behaves like :ref:`MPI_Waitsome`, except that it returns immediately. Returns in outcount the number of requests from the list array_of_requests that have completed. Returns in the first outcount locations of the array array_of_indices the indices of these operations (index within the array array_of_requests; the array is indexed from 0 in C and from 1 in Fortran). Returns in the first outcount locations of the array array_of_status the status for these completed operations. If a request that completed was allocated by a nonblocking communication call, then it is deallocated, and the associated handle is set to MPI_REQUEST_NULL. If no operation has completed it returns outcount = 0. If there is no active handle in the list, it returns outcount = MPI_UNDEFINED. :ref:`MPI_Testsome` is a local operation, which returns immediately, whereas :ref:`MPI_Waitsome` blocks until a communication completes, if it was passed a list that contains at least one active handle. Both calls fulfill a fairness requirement: If a request for a receive repeatedly appears in a list of requests passed to :ref:`MPI_Waitsome` or :ref:`MPI_Testsome`, and a matching send has been posted, then the receive will eventually succeed unless the send is satisfied by another receive; send requests also fulfill this fairness requirement. Errors that occur during the execution of :ref:`MPI_Testsome` are handled as for :ref:`MPI_Waitsome`. If your application does not need to examine the *array_of_statuses* field, you can save resources by using the predefined constant MPI_STATUSES_IGNORE can be used as a special value for the *array_of_statuses* argument. NOTES ----- The use of :ref:`MPI_Testsome` is likely to be more efficient than the use of :ref:`MPI_Testany`. The former returns information on all completed communications; with the latter, a new call is required for each communication that completes. A server with multiple clients can use :ref:`MPI_Waitsome` so as not to starve any client. Clients send messages to the server with service requests. The server calls :ref:`MPI_Waitsome` with one receive request for each client, then handles all receives that have completed. If a call to :ref:`MPI_Waitany` is used instead, then one client could starve while requests from another client always sneak in first. ERRORS ------ .. include:: ./ERRORS.rst For each invocation of :ref:`MPI_Testsome`, if one or more requests generate an MPI error, only the *first* MPI request that caused an error will be passed to its corresponding error handler. No other error handlers will be invoked (even if multiple requests generated errors). However, *all* requests that generate an error will have a relevant error code set in the corresponding ``status.MPI_ERROR`` field (unless ``MPI_STATUSES_IGNORE`` was used). If the invoked error handler allows :ref:`MPI_Testsome` to return to the caller, the value ``MPI_ERR_IN_STATUS`` will be returned in the C and Fortran bindings. .. seealso:: * :ref:`MPI_Comm_set_errhandler` * :ref:`MPI_File_set_errhandler` * :ref:`MPI_Test` * :ref:`MPI_Testall` * :ref:`MPI_Testany` * :ref:`MPI_Wait` * :ref:`MPI_Waitall` * :ref:`MPI_Waitany` * :ref:`MPI_Waitsome` * :ref:`MPI_Win_set_errhandler`