<div dir="ltr">Thanks for the answer. I would like to ask just some follow-up questions though.<div><br></div><div></div><div><b>Question 1.</b> In our application there are two modules that run concurrently and rely on MPI (using two different communicators for isolation purposes). During the development time we observed the following behavior: when one of the modules sends a large buffer (say +1GB), the other one encountered a kind of contention problem where its messages were held back through the duration of the large data transfer, even though second module messages were really small. Is this a known behavior? Is there any kind of message fragmentation implemented in MPICH that would allow concurrent message progression? If not, are there any plans to implement such a feature?<br></div><div><br></div><div><b>Question 2.</b> We already have used one of the scenarios described in the previous email, where one thread of a process A sends a message to one of multiple threads on a process B, all of which are waiting on the same message triple through non-blocking receives. The expected behaviour would be that only one of the threads from process B would receive the message, but, during our tests we have faced a failure where a segfault would be thrown from inside <i>MPI_Recv </i>function at one of the receiving threads. Is the expected behavior correct? Is there any known issue with this use case that would trigger the described problem? I know this can probably be the application's fault, I just want to check if there is any known issue on the matter.</div><div><br></div><div>Thanks,</div><div>Guilherme Valarini</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Em ter., 26 de jan. de 2021 às 18:55, Zhou, Hui <<a href="mailto:zhouh@anl.gov">zhouh@anl.gov</a>> escreveu:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="EN-US" style="overflow-wrap: break-word;">
<div class="gmail-m_-6173497848285487323WordSection1">
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">> <b>Question 1</b>. I am aware of the message envelope tuples (source, destination, tag, communicator) that may be used to identify and filter different messages. While using MPICH, can I rely on such information in order to guarantee that
 the correct messages will reach/be matched with their destinations in a multiprocess multithreaded program?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Yes, you can rely on the correctness of MPI implementation. That is, if your `rank, tag, communicator` matches the messages correctly to your intention, then you can trust that a correct implementation will do that even in a multi-threaded
 setting.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">The care need be taken that when your `rank, tag, ,communicator` doesn’t uniquely match, and if you send or receive in different threads, the order of matching is not certain, and it may surprise you. But that is just the perils of concurrent
 programming.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">> <b>Question 2</b>. Is there a problem when mixing blocking and non-blocking calls on opposite sides of a message? Even in the multithreaded scenarios described previously? (e.g. matching a
<i>MPI_Isend</i> with a <i>MPI_Recv</i>, and vice-versa.)<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">No, there is no problem in that.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<div>
<p class="MsoNormal">-- <br>
Hui Zhou<u></u><u></u></p>
</div>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(181,196,223);padding:3pt 0in 0in">
<p class="MsoNormal" style="margin-bottom:12pt"><b><span style="font-size:12pt;color:black">From:
</span></b><span style="font-size:12pt;color:black">Guilherme Valarini via discuss <<a href="mailto:discuss@mpich.org" target="_blank">discuss@mpich.org</a>><br>
<b>Date: </b>Tuesday, January 26, 2021 at 3:24 PM<br>
<b>To: </b><a href="mailto:discuss@mpich.org" target="_blank">discuss@mpich.org</a> <<a href="mailto:discuss@mpich.org" target="_blank">discuss@mpich.org</a>><br>
<b>Cc: </b>Guilherme Valarini <<a href="mailto:guilherme.a.valarini@gmail.com" target="_blank">guilherme.a.valarini@gmail.com</a>><br>
<b>Subject: </b>[mpich-discuss] Questions about MPICH multi-thread support<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal">Dear MPICH community,<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I am currently developing an event system built upon MPI and I have a few questions about the current state of multi-thread support from MPICH in the <i>MPI_THREAD_MULTIPLE</i> mode.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><b>Question 1</b>. I am aware of the message envelope tuples (source, destination, tag, communicator) that may be used to identify and filter different messages. While using MPICH, can I rely on such information in order to guarantee that
 the correct messages will reach/be matched with their destinations in a multiprocess multithreaded program? I know this is quite a broad question, but I am more interested in the analysis of the following scenarios.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<ul type="disc">
<li class="MsoNormal">
Two threads in a process A want to send different messages to two different processes, B and C (each with one thread), while using the
<b>same</b> <b>communicator</b> <b>and</b> <b>tag</b>. Code example:<u></u><u></u></li></ul>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">  // One process with N threads to N process with one thread (same tag)<br>
  if (rank == 0) {<br>
    std::thread t1([&]() { <br>
      // Generate data ...<br>
      MPI_Send(data, 1, MPI_CHAR, 1, 0, MPI_COMM_WORLD);<br>
    });<br>
    std::thread t2([&]() { <br>
      // Generate data ...<br>
      MPI_Send(data, 1, MPI_CHAR, 2, 0, MPI_COMM_WORLD);<br>
    });<br>
    t1.join(); t2.join();<br>
  } else {<br>
    MPI_Recv(data, 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);<br>
  }<u></u><u></u></p>
</blockquote>
<div>
<ul type="disc">
<li class="MsoNormal">
The same scenario as above, but now each thread uses a <b>different tag</b> to communicate to their respective process while only sharing the
<b>same</b> <b>communicator</b>. Code example:<u></u><u></u></li></ul>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">  // One process with N threads to N process with one thread (different tags)<br>
  if (rank == 0) {<br>
    std::thread t1([&]() { <br>
      // Generate data ...<br>
      MPI_Send(data, 1, MPI_CHAR, 1, 1, MPI_COMM_WORLD);<br>
    });<br>
    std::thread t2([&]() { <br>
      // Generate data ...<br>
      MPI_Send(data, 1, MPI_CHAR, 2, 2, MPI_COMM_WORLD);<br>
    });<br>
    t1.join(); t2.join();<br>
  } else {<br>
    MPI_Recv(data, 1, MPI_CHAR, 0, rank, MPI_COMM_WORLD, MPI_STATUS_IGNORE);<br>
  }<u></u><u></u></p>
</blockquote>
<ul type="disc">
<li class="MsoNormal">
Multiple threads from a process A want each to send a message to the same thread of another process B using the
<b>same communicator and</b> <b>tag</b>. Code example:<u></u><u></u></li></ul>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">  // One process with N threads to one process with one thread (same tags)<br>
  if (rank == 0) {<br>
    std::thread t1([&]() {<br>
      // Generate data ...<br>
      MPI_Send(data, 1, MPI_CHAR, 1, 0, MPI_COMM_WORLD);<br>
    });<br>
    std::thread t2([&]() { <br>
      // Generate data ...<br>
      MPI_Send(data, 1, MPI_CHAR, 1, 0, MPI_COMM_WORLD);<br>
    });<br>
    t1.join(); t2.join();<br>
  } else if (rank == 1) {<br>
    MPI_Recv(data, 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);<br>
    // Process data ...<br>
    MPI_Recv(data, 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);<br>
    // Process data ...<br>
  }<u></u><u></u></p>
</blockquote>
<ul type="disc">
<li class="MsoNormal">
One thread from a process A wants to send a message to one of multiple threads from a process B using the
<b>same communicator and tag</b>. Code example:<u></u><u></u></li></ul>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">  // One process with one thread to one process with N threads (same tags)<br>
  if (rank == 0) {<br>
    MPI_Request requests[2];<br>
    // Generate data ...<br>
    MPI_Isend(data, 1, MPI_CHAR, 1, 0, MPI_COMM_WORLD, &requests[0]);<br>
    // Generate data ...<br>
    MPI_Isend(data, 1, MPI_CHAR, 1, 0, MPI_COMM_WORLD, &requests[1]);<br>
<br>
    MPI_Waitall(2, requests, MPI_STATUSES_IGNORE);<br>
  } else if (rank == 1) {<br>
    std::thread t1([&]() {<br>
      MPI_Recv(data, 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);<br>
      // Process data ...<br>
    });<br>
    std::thread t2([&]() {<br>
      MPI_Recv(data, 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);<br>
      // Process data ...<br>
    });<br>
    t1.join(); t2.join();<br>
  }<u></u><u></u></p>
</blockquote>
</div>
<div>
<ul type="disc">
<li class="MsoNormal">
Two threads from a process A want each to send a message to two threads from a process B using different tags for each pair of threads (e.g. the pair A.1/B.1 uses a different tag from pair A.2/B.2). Code example:<u></u><u></u></li></ul>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">  // One process with N threads to one process with N thread (different tags)<br>
  if (rank == 0) {<br>
    std::thread t1([&]() {<br>
      // Generate data ...<br>
      MPI_Send(data, 1, MPI_CHAR, 1, 1, MPI_COMM_WORLD);<br>
    });<br>
    std::thread t2([&]() { <br>
      // Generate data ...<br>
      MPI_Send(data, 1, MPI_CHAR, 1, 2, MPI_COMM_WORLD);<br>
    });<br>
    t1.join(); t2.join();<br>
  } else if (rank == 1) {<br>
    std::thread t1([&]() {<br>
      MPI_Recv(data, 1, MPI_CHAR, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);<br>
      // Process data ...<br>
    });<br>
    std::thread t2([&]() {<br>
      MPI_Recv(data, 1, MPI_CHAR, 0, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);<br>
      // Process data ...<br>
    });<br>
    t1.join(); t2.join();<br>
  }<u></u><u></u></p>
</blockquote>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><b>Question 2</b>. Is there a problem when mixing blocking and non-blocking calls on opposite sides of a message? Even in the multithreaded scenarios described previously? (e.g. matching a
<i>MPI_Isend</i> with a <i>MPI_Recv</i>, and vice-versa.)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Thank you.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Regards,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Guilherme Valarini<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
</div>

</blockquote></div>