Perhaps i misunderstand your question...
Generally, it is the user's job to provide the buffers both to send and receive.
If you call MPI_Recv, you must pass a buffer that is large enough to
hold the data sent by the
corresponding MPI_Send. I.e., if you know your sender will send
messages of 100kB,
then you must provide a buffer of size 100kB to the receiver.
If the message size is unknown at compile time, you may have to send
two messages:
first an integer which tells the receiver how large a buffer it has to
allocate, and then
the actual message (which then nicely fits into the freshly allocated buffer)

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

#include <time.h>


#include "mpi.h"

#define SENDER     1
#define RECEIVER   0
#define TAG_LEN   77
#define TAG_DATA  78
#define MAX_MESSAGE 16

int main(int argc, char *argv[]) {

    int num_procs;
    int rank;
    int *send_buf;
    int *recv_buf;
    int send_message_size;
    int recv_message_size;
    MPI_Status st;
    int i;

    /* initialize random numbers */
    srand(time(NULL));
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    if (rank == RECEIVER) {
        /* the receiver */
        /* wait for message length */
        MPI_Recv(&recv_message_size, 1, MPI_INT, SENDER, TAG_LEN,
MPI_COMM_WORLD, &st);
        /* create a buffer of the required size */
        recv_buf = (int*) malloc(recv_message_size*sizeof(int));
        /* get data */
        MPI_Recv(recv_buf, recv_message_size, MPI_INT, SENDER,
TAG_DATA, MPI_COMM_WORLD, &st);

        printf("Receiver got %d integers:", recv_message_size);
        for (i = 0; i < recv_message_size; i++) {
            printf(" %d", recv_buf[i]);
        }
        printf("\n");

        /* clean up */
        free(recv_buf);

    } else if (rank == SENDER) {
        /* the sender */
        /* random message size */
        send_message_size = (int)((1.0*MAX_MESSAGE*rand())/(1.0*RAND_MAX));
        /* create a buffer of the required size */
        send_buf = (int*) malloc(send_message_size*sizeof(int));
        /* create random message */
        for (i = 0; i < send_message_size; i++) {
            send_buf[i] = rand();
        }

        printf("Sender has %d integers:", send_message_size);
        for (i = 0; i < send_message_size; i++) {
            printf(" %d", send_buf[i]);
        }
        printf("\n");

        /* send message size to receiver */
        MPI_Send(&send_message_size,  1, MPI_INT, RECEIVER, TAG_LEN,
MPI_COMM_WORLD);
        /* now send messagge */
        MPI_Send(send_buf, send_message_size, MPI_INT, RECEIVER,
TAG_DATA, MPI_COMM_WORLD);

        /* clean up */
        free(send_buf);

    }

    MPI_Finalize();
}

I hope this helps
  Jody


On Sat, Jul 10, 2010 at 7:12 AM, Jack Bryan <dtustud...@hotmail.com> wrote:
> Dear All:
> How to find the buffer size of OpenMPI ?
> I need to transfer large data between nodes on a cluster with OpenMPI 1.3.4.
> Many nodes need to send data to the same node .
> Workers use mpi_isend, the receiver node use  mpi_irecv.
> because they are non-blocking, the messages are stored in buffers of
> senders.
> And then, the receiver collect messages from its buffer.
> If the receiver's buffer is too small, there will be truncate error.
> Any help is appreciated.
> Jack
> July 9  2010
>
> ________________________________
> Hotmail is redefining busy with tools for the New Busy. Get more from your
> inbox. See how.
> _______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users
>

Reply via email to