<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Hi, <br>
    </p>
    <p>(text location provided w.r.t MPI 3.1
      <a class="moz-txt-link-freetext" href="https://www.mpi-forum.org/docs/mpi-3.1/mpi31-report.pdf">https://www.mpi-forum.org/docs/mpi-3.1/mpi31-report.pdf</a>)<br>
    </p>
    <p> a) In 3.2.4, page 29, there is a discussion regarding the size
      of the buffer and size of the actual message with an "advice to
      users" section stating that : <br>
      "The MPI_<span class="highlight">PROBE</span> function described
      in Section 3.8 can be used to receive messages of unknown length."</p>
    <p> b) There is no such discussion in 3.7.2 so one could assume
      (maybe too optimistically) that the same advice applies w.r.t.
      MPI_Iprobe.</p>
    <p> c) In 3.8.1. page 66 line 9 "The MPI implementation of MPI_PROBE
      and MPI_IPROBE needs to guarantee <span class="highlight
        selected">progre</span>ss: [calling those functions, msg should
      arrive eventually if send and not intercepted].</p>
    <p> d) The "Progress" note in 3.7.4, illustrated by example 3.14,
      seems to indicate that a synchronous send can not be blocked if a
      recv has been posted regardless of the completion of that receive.</p>
    <p>But I could not find anything explicitly stating that MPI_Iprobe
      would initiate a receive the way MPI_Irecv does. <br>
    </p>
    <p>That is, a slightly modified 3.14 example:<br>
    </p>
    <p>CALL MPI_COMM_RANK(comm, rank, ierr)<br>
      IF (RANK.EQ.0) THEN<br>
          CALL MPI_SSEND(a, n, MPI_REAL, 1, 0, comm, ierr)<br>
          CALL MPI_SEND(b, 1, MPI_REAL, 1, 1, comm, ierr)<br>
      ELSE IF (rank.EQ.1) THEN<br>
          CALL MPI_IPROBE(0, 0, comm, flag, status1, ierr)<br>
          CALL MPI_RECV(b, 1, MPI_REAL, 0, 1, comm, status2, ierr)<br>
          ... extract size info from status1  once available ....<br>
          CALL MPI_IRECV(a, n, MPI_REAL, 0, 0, comm, r, ierr)<br>
          CALL MPI_WAIT(r, status, ierr)<br>
      END IF</p>
    <p>could deadlock in a correct MPI implementation.<br>
      <br>
      If I am correct in assuming that the MPI standard ask for the
      MPI_Iprobe to progress, it is not required to initiate. If true,
      it means the the point a) above does not extend to the non
      blocking communications and that the MPI does not provide a way to
      receive messages of unknown size whithout adding more
      opportunities for deadlocks. <br>
    </p>
    <p>Am I correct ? and if yes, does that indicate that the discussion
      and advice of point a could be adapted and explicitly added for
      the non blocking case (point b).<br>
    </p>
    <p>Thanks</p>
    <p>Alain<br>
    </p>
    <p><br>
    </p>
  </body>
</html>