Rookie HPC

About

Docs

Tools

Tests

MPI_Isend

Definition

MPI_Isend is the standard non-blocking send (the capital ā€˜Iā€™ stands for immediate return). The word standard indicates that this routine is not explicitly told whether to send the message in a synchronous mode or asynchronous mode. Instead, MPI_Isend will make that decision itself; it will issue an asynchronous non-blocking send (MPI_Ibsend) if there is enough space in the buffer attached to MPI (MPI_Buffer_attach) to copy the buffer passed, issuing a synchronous non-blocking send (MPI_Issend) otherwise. Either way, as a non-blocking send, MPI_Isend will not block until the buffer passed is safe to be reused. In other words, the user must attempt to reuse the buffer after MPI_Isend returns without explicitly checking for MPI_Isend completion (MPI_Wait or MPI_Test). Other non-blocking sends are MPI_Ibsend, MPI_Issend, MPI_Irsend. Refer to its blocking counterpart, MPI_Send, to understand when the completion is reached.

Copy

Feedback

int MPI_Isend(const void* buffer,
              int count,
              MPI_Datatype datatype,
              int recipient,
              int tag,
              MPI_Comm communicator,
              MPI_Request* request);

Parameters

buffer
The buffer to send.
count
The number of elements to send.
datatype
The type of one buffer element.
recipient
The rank of the recipient MPI process.
tag
The tag to apply to the message.
communicator
The communicator in which the communication takes place.
request
The request handle on the non-blocking communication taking place.

Returned value

MPI_SUCCESS
The routine successfully completed.

Example

Copy

Feedback

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

/**
 * @brief Illustrates how to send a message in a non-blocking fashion.
 * @details This program is meant to be run with 2 processes: a sender and a
 * receiver.
 **/
int main(int argc, char* argv[])
{
    MPI_Init(&argc, &argv);

    // Get the number of processes and check only 2 processes are used
    int size;
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    if(size != 2)
    {
        printf("This application is meant to be run with 2 processes.\n");
        MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
    }

    // Get my rank and do the corresponding job
    enum role_ranks { SENDER, RECEIVER };
    int my_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    switch(my_rank)
    {
        case SENDER:
        {
            int buffer_sent = 12345;
            MPI_Request request;
            printf("MPI process %d sends value %d.\n", my_rank, buffer_sent);
            MPI_Isend(&buffer_sent, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &request);
            
            // Do other things while the MPI_Isend completes
            // <...>

            // Let's wait for the MPI_Isend to complete before progressing further.
            MPI_Wait(&request, MPI_STATUS_IGNORE);
            break;
        }
        case RECEIVER:
        {
            int received;
            MPI_Recv(&received, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            printf("MPI process %d received value: %d.\n", my_rank, received);
            break;
        }
    }

    MPI_Finalize();

    return EXIT_SUCCESS;
}