Rookie HPC

Sending

C | FORTRAN-legacy | FORTRAN-2008

MPI_Send

Definition

MPI_Send is the standard blocking send routine. 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_Send will make that decision itself; it will issue an asynchronous blocking send (MPI_Bsend) if there is enough space in the buffer attached to MPI (MPI_Buffer_attach) to copy the buffer passed, issuing a synchronous blocking send (MPI_Ssend) otherwise. Either way, since MPI_Send remains a blocking send, it means that the buffer passed can be safely reused as soon as the routine returns. Other blocking sends are MPI_Ssend, MPI_Bsend and MPI_Rsend. Refer to MPI_Isend to see the non-blocking counterpart of MPI_Send.

Copy

Feedback

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

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 assign to the message.
communicator
The communicator in which the standard send takes place.

Returned value

The error code returned from the standard send.

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 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;
            printf("MPI process %d sends value %d.\n", my_rank, buffer_sent);
            MPI_Send(&buffer_sent, 1, MPI_INT, RECEIVER, 0, MPI_COMM_WORLD);
            break;
        }
        case RECEIVER:
        {
            int received;
            MPI_Recv(&received, 1, MPI_INT, SENDER, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            printf("MPI process %d received value: %d.\n", my_rank, received);
            break;
        }
    }

    MPI_Finalize();

    return EXIT_SUCCESS;
}