I believe what you are eluding to is " what is the maximum temperary holding buffer size created automatically by MPI". For that I don't know the answer to, althogh I have sent data array of mpi_real8 of size over 15000 with isend and irecv without problems.
On 7/10/10, Jack Bryan <dtustud...@hotmail.com> wrote: > > Hi, > thanks for the program from Jody. > David indicated the question that I want to ask. > But, Jody's approach is ok when the MPI built-in buffer size is large enough > to hold the message such as 100kB in the buffer. > In asynchronous communication, when the sender posts a mpi_isend, the > message is put in a buffer provided by the MPI. > At this point, the receiver may still not post its corresponding mpi_irecv. > So, the buffer size is important here. > Without knowing the buffer size, I may get " truncate error " on Open MPI. > How to know the size of the buffer automatically created by Open MPI in the > background ? > Any help is appreciated. > Jack, > July 10 2010 > From: solarbik...@gmail.com > Date: Sat, 10 Jul 2010 16:46:12 -0700 > To: us...@open-mpi.org > Subject: Re: [OMPI users] OpenMPI how large its buffer size ? > > I believe his question is regarding when under non-blocking send/recv, how > does MPI know how much memory to allocate to receive the message, since the > size is determined AFTER the irecv is posted. So if the send post isend, > but the receiver hasn't post irecv, what would the MPI do with the message. > > > > I believe MPI would automatically create a buffer in the background to store > the message. > > On Sat, Jul 10, 2010 at 1:55 PM, jody <jody....@gmail.com> wrote: > > > 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 > >> > > > > _______________________________________________ > > users mailing list > > us...@open-mpi.org > > http://www.open-mpi.org/mailman/listinfo.cgi/users > > > > -- > David Zhang > University of California, San Diego > > _________________________________________________________________ > Hotmail has tools for the New Busy. Search, chat and e-mail from your inbox. > http://www.windowslive.com/campaign/thenewbusy?ocid=PID28326::T:WLMTAGL:ON:WL:en-US:WM_HMP:042010_1 -- Sent from my mobile device David Zhang University of California, San Diego