<div dir="ltr"><div><span style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">I am trying to implement a logical ring with MPI; where every process receives a message from process with id one less than that of current process and forwards to the next process in cyclic fashion. My aim is to traffic buffer such that it loses some messages or maybe puts them in out of order.</span><br style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">
<span style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">A cycle of communication will finish when a message dispatched by root node comes back again to root.</span><br style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">
<span style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">here is the code that I have tried: I am just including relevant </span><span style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">parts of it.</span></div>
<div><pre style="margin-top:0px;margin-bottom:10px;padding:5px;border:0px;font-size:14px;vertical-align:baseline;background-color:rgb(238,238,238);font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif;overflow:auto;width:auto;max-height:600px;color:rgb(0,0,0);line-height:18px">
<code style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif">  if(procId!=root)
{
  sleep(100);
  while(1)
{
  tm = MPI_Wtime();
  MPI_Irecv( &message, STR_LEN, MPI_CHAR, 
         ((procId-1)>=0?(procId-1):(numProc-1)),RETURN_DATA_TAG, 
         MPI_COMM_WORLD,&receiveRequest);

  MPI_Wait(&receiveRequest,&status);
  printf("%d: Received\n",procId);

  if(!strncmp(message,"STOP",4)&&(procId==(numProc-1)))
    break;

  MPI_Ssend( message, STR_LEN, MPI_CHAR,
         (procId+1)%numProc, SEND_DATA_TAG, MPI_COMM_WORLD);
  if(!strncmp(message,"STOP",4))
    break;
  printf("%d: Sent\n",procId);
}
}
else
{
  for(iter=0;iter<benchmarkSize;iter++)
{
  //Synthesize the message
  message[STR_LEN-1] = '\0';
  iErr = MPI_Bsend( message, STR_LEN, MPI_CHAR,
         (root+1)%numProc, SEND_DATA_TAG, MPI_COMM_WORLD);
  if (iErr != MPI_SUCCESS) {
    char error_string[BUFSIZ];
    int length_of_error_string;
    MPI_Error_string(iErr, error_string, &length_of_error_string);
    fprintf(stderr, "%3d: %s\n", procId, error_string);
  }

  tm = MPI_Wtime();
  while(((MPI_Wtime()-tm)*1000)<delay);
  printf("Root: Sending\n");
}

  for(iter=0;iter<benchmarkSize;iter++)
{
  MPI_Recv(message,STR_LEN,MPI_CHAR,
       (numProc-1),RETURN_DATA_TAG,MPI_COMM_WORLD,&status);

  //We should not wait for the messages to be received but wait for certain amount of time

  //Extract the fields in the message
  if(((prevRcvdSeqNum+1)!=atoi(seqNum))&&(prevRcvdSeqNum!=0))
    outOfOrderMsgs++;
  prevRcvdSeqNum = atoi(seqNum);
  printf("Seq Num: %d\n",atoi(seqNum));
  rcvdMsgs++;
  printf("Root: Receiving\n");
}
  MPI_Isend( "STOP", 4, MPI_CHAR,
     (root+1)%numProc, SEND_DATA_TAG, MPI_COMM_WORLD,&sendRequest);
  MPI_Wait(&sendRequest,&status);

  /*This is to ask all other processes to terminate, when the work is done*/
}</code></pre><div><span style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">Now, I have these questions: </span></div><div><span style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">1) Why is it that when I inject some sleep in the other processes(I mean other than root) of the ring; NO receive is taking place?</span><br style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">
<span style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">2) Even when the buffer size is only one, how is it that root node is able to dispatch messages through MPI_Bsend without an error? for example the case when it needs to send total 10 messages at a rate of 1000 per second and with buffer size of 1. MPI_Bsend is able to dispatch all the messages without any error of "buffer full"; irrespective of the presence of sleep() in other processes of the ring! </span></div>
<div style><span style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px"><br></span></div><div style><span style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">In short How on earth is MPI_Bsend is not giving me an error "Insufficient space in buffer" even if my buffersize is size enough to accommodate only a single message, MPI_Bsend did not show an error for 65 of the total 100 messages sent? I intentionally made the receive buffers to be unavailable by making other processes to sleep before they start processing receive and send.</span></div>
<div><span style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px"><br></span></div><div><span style="color:rgb(0,0,0);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:14px;line-height:18px">Thanks a ton!</span><br>
</div>-- <br><div dir="ltr">V</div>
</div></div>