<div>More</div><div><br></div><div>#5)</div><div><br></div><div>A parallel thread, running on the same group as the communicator used for the user program in FTBLOCK, would be free to be running a gossip protocol,</div><div>
instantiated</div><div>a) by the user at his/her choice</div><div>b) by MPI at its choice, by user demand</div><div><br></div><div>This parallel inspector thread propagates error state, and accepts input to the error state by allowing user programs to assert error state within the FTBLOCK.</div>
<div><br></div><div>You can think of this parallel thread as cooperation of the progress engines with gossip, or as a completely optional activity, created by the user, or as </div><div>a part of the FT proposal.  As long as there are local ways to add error state, we can write this as a layered library for the sake of making sure that local</div>
<div>errors are propagated (remembering that MPI is returning local errors to the user inside his/her FTBLOCK).</div><div><br></div><div>If we want the implementation to provide/support this kind of FT-friendly error propagation, that is a bigger step, which I am not advocating as required.</div>
<div>I think it would be nice to have this be part of a fault tolerant communication space.  But, I am OK with users doing this for themselves, esp. because they</div><div>can control granularity better.</div><div><br></div>
<div>#6) I think MPI_COMM_WORLD is a bummer in the FT world.  We don't want it to hang around very long after we get going.  If we are really working on</div><div>subgroups, and these subgroups form a hierarchical graph, rather than an all-to-all virtual topology, I don't want to reconstruct MPI_COMM_WORLD after</div>
<div>the first process breaks.  So - as an example of pain of MPI scalability - the build-down model of MPI-1 is less good for this than a build-up</div><div>model, where we find a way for groups to rendezvous.  Obviously, for convenience, the all-to-all virtual topology in the onset of MPI_Init() is nice,</div>
<div>but I am assuming that errors may happen quite quickly.  </div><div><br></div><div>MPI_Init() with no failures is only good for a limited window of time, given failure rates.  During this time, we would like to "turn off MPI_COMM_WORLD"</div>
<div>unless we really don't need it, or at least not have to reconstruct it ever if we don't need it.</div><div><br></div><div>So, we need to agree on a fault-friendly MPI_Init()...</div><div><br></div><div>An FTBLOCK-like idea surrounding MPI_Init(), where the external rules of spawning MPI, or the spawn command that creates the world, create an effective communicator.  We should generalize MPI_Init() to support outcomes other than pure success, such as partial success (e.g., smaller world than stipulated).</div>
<div><br></div><div>A really good approach would be to only create the actual communicators you really need to run your process, not the virtual-all-to-all world of MPI-1 and MPI-2.</div><div>But, that is a heresy, so forgive me.</div>
<div><br></div><div>Tony</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br><br><div class="gmail_quote">On Mon, Jan 16, 2012 at 2:46 PM, Anthony Skjellum <span dir="ltr"><<a href="mailto:tony@runtimecomputing.com">tony@runtimecomputing.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Satantan,<div><br></div><div>Here are my further thoughts, which hopefully includes an answer to your questions :-)</div>
<div><br></div><div>1) Everything is set to "ERRORS return"; the goal is to get local errors back if they are available.  </div>
<div><br></div><div>2) I would emphasize non-blocking operations, but blocking operations implemented with internal timeout could return a timeout-type error</div><div><br></div><div>3) You don't have to return the same return code, or the same results in all processes in the communicator, you can get erroneous results</div>

<div>    or local failures; the functions are also allowed to produce incorrect results [and we should then discuss what error reporting means here...</div><div>    I am happy with local errors returned where known, recognizing those processes may die before the bottom of the block.  However, I also</div>

<div>    expect the implementation to do its best to propagate error state knowledge within this FTBLOCK, based organically on ongoing communication</div><div>    or on gossip if an implementation so chose.]</div><div><br>

</div><div>   Also, because we assume that there is also algorithmic fault tolerance at work, local errors may be raised by the application because it is doing checks</div><div>   for validity etc.</div><div><br></div><div>

  So, either MPI or the application may raise local errors prior to the bottom of the FTBLOCK, and the success of the bottom of the block must be allowed</div><div>  to be fail, just based on ABFT inputs from the application to MPI, not just based on MPI's opinion.</div>

<div><br></div><div>4) If you are willing to do everything nonblocking, then I can describe the test at the bottom of the FTBLOCK as follows:</div><div><br></div><div>The test operation at the bottom of the FTBLOCK is effectively a generalized WAIT_ALL, that completes or doesn't complete all the outstanding</div>

<div>requests, returning errors related to the faults observed, and providing a unified 0/1 success failure state consistently across the group of comm</div><div>[or surviving members thereof].  </div><div><br></div><div>

In my view, the application as well as MPI can contribute error state as input to the FTBLOCK test.</div><div><br></div><div>Also, the application that gets local errors inside the loop already is immediately ready to punt at that point, and do a jump to the bottom of the loop.  Let's </div>

<div>assume it is required to do all the operations before getting to the bottom of the loop, for now, and we just allow that some of these may return further</div><div>errors (I am trying to keep it simple), and MPI-like rules of all attempting the operations.  If we can get this to work, we can weaken it later.</div>

<div><br></div><div>There is no good way to describe some BLOCKING, some nonblocking operations, because we have no descriptor to tell us if something failed that previously</div><div>returned... and did not give a local error, so I am not going to pursue BLOCKING for now.  Let's assume we cannot do BLOCKING, and weaken this later,</div>

<div>if we can get a consistent solution using all nonblocking.  </div><div><br></div><div>Please tell me what you think.</div><div><br></div><div>Thanks for responding!</div><div><br></div><div>Tony</div><div class="HOEnZb">
<div class="h5"><div><br></div><div>
<br><div class="gmail_quote">On Mon, Jan 16, 2012 at 12:39 PM, Sur, Sayantan <span dir="ltr"><<a href="mailto:sayantan.sur@intel.com" target="_blank">sayantan.sur@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">







<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Hi Tony,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">In the example semantics you mentioned, are the “ops” required to return the same result on all processors? Although this doesn’t change the API “op”, but it
 does change completion semantics of almost all MPI ops. I hope I am correctly interpreting your message.<u></u><u></u></span></p><div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Thanks.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">===</span><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u><u></u></span></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Sayantan Sur, Ph.D.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Intel Corp.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
</div><div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> <a href="mailto:mpi3-ft-bounces@lists.mpi-forum.org" target="_blank">mpi3-ft-bounces@lists.mpi-forum.org</a> [mailto:<a href="mailto:mpi3-ft-bounces@lists.mpi-forum.org" target="_blank">mpi3-ft-bounces@lists.mpi-forum.org</a>]
<b>On Behalf Of </b>Anthony Skjellum<br>
<b>Sent:</b> Sunday, January 15, 2012 7:06 PM</span></p><div><div><br>
<b>To:</b> MPI 3.0 Fault Tolerance and Dynamic Process Control working Group<br>
<b>Subject:</b> Re: [Mpi3-ft] simplified FT proposal<u></u><u></u></div></div><p></p>
</div>
</div><div><div>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Everyone, I think we need to start from scratch.<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">We should look for minimal fault-tolerant models that are achievable and useful.  They may allow for a combination of faults (process and network), but in the end, as discussed in San Jose:<u></u><u></u></p>


</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">FTBLOCK<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">--------------<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Start_Block(comm)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">op [normal MPI operation on communicator specified by Start_Block, or subset thereof]<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">op<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">op<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Test_Block(comm)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Which either succeeds, or fails, on the whole list of operations, followed by ways to reconstruct communicators and add back processes (easily),<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">provides for 3-level fault tolerant model<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">a) Simply retry if the kind of error at the Test_Block is retryable<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">b) Simply reconstruct the communicator, use algorithmic fault tolerance to get lost data, and retry the block<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">c) drop back to 1 or more levels of checkpoint-restart.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">We can envision in this model an unrolling of work, in terms of a parameter N, if there is a lot of vector work, to allow granularity control<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">as a function of fault environment.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">In some sense, a simpler model, that provides for efforts to detect<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">a) by MPI<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">b) allowing application monitor to assert failure asynchronously to this loop<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">provides a more general ability to have coverage of faults, including but not limited to process faults and possible network faults.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">It changes the API very little.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">It motivates the use of buffers, not zero copy, to support the fact that you may to roll-back a series of operations, thereby revealing fault-free overhead directly.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Start_Block and Test_Block are collective and synchronizing, such as barriers.  Because we have uncertainty to within a message, multiple barriers (as mentioned by George Bosilca K to me in a sidebar at the meeting).<u></u><u></u></p>


</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">We try to get this to work, COMPLETELY, and ratify this in MPI 3.x, if we can.  Once we have this stable intermediate form, we explore more<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">options.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I think it is important to recognize that the reconstruction step, including readding processes and making new communicators may mean smarter Join operations.  It is clear we need to be able to treat failures during the recovery process,
 and use a second level loop, possibly bombing out<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">to checkpoint, if we cannot make net progress on recovery because of unmodeled error issues.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">The testing part leverages all the learning so far, but needn't be restricted to modeled errors like process faults.  There can be modeled and unmodeled faults.  Based on what fault comes up, the user application then has to decide how
 hard a retry to do, whether just to add processes,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">whether just to retry the loop, whether to go to a checkpoint, whether to restart the APP.  MPI could give advice, based on its understanding of<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">the fault model, in terms of sufficient conditions for "working harder" vs "trying the easiest" for fault models it understands somewhat for a system.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Now, the comments here are a synopsis of part of the side bars and open discussion we had in San Jose, distilled a bit.  I want to know why <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">we can't start with this, succeed with this, implement and test it, and having succeeded, do more in a future 3.y, y > x release, given user experience.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I am not speaking to the choice of "killing all communicators" as with FT-MPI, or "just remaking those you need to remake."  I think we need to resolve.  Honestly, groups own the fault property, not communicators, and all groups held by
 communicators where the fault happened should be rebuilt, not all communicators...  Let's argue on that.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">So, my suggestion is REBOOT the proposal with something along lines above, unless you all see this is no better.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">With kind regards,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Tony<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>
<p class="MsoNormal"><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>
<p class="MsoNormal"><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>
<p class="MsoNormal">On Sun, Jan 15, 2012 at 8:00 PM, Sur, Sayantan <<a href="mailto:sayantan.sur@intel.com" target="_blank">sayantan.sur@intel.com</a>> wrote:<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Hi Bill,</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I am in agreement with your suggestion to have a collective over a communicator that returns a new
 communicator containing ranks “alive some point during construction”. It provides cleaner semantics. The example was merely trying to utilize the new MPI_Comm_create_group API that the Forum is considering.</span><u></u><u></u></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">MPI_Comm_check provides a method to form global consensus in that all ranks in comm did call it.
 It does not imply anything about current status of comm, or even the status “just before” the call returns. During the interval before the next call to MPI_Comm_check, it is possible that many ranks fail. However, the app/lib using MPI knows the point where
 everyone was alive.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Thanks.</span><u></u><u></u></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">===</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Sayantan Sur, Ph.D.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Intel Corp.</span><u></u><u></u></p>
</div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
</div>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">
<a href="mailto:mpi3-ft-bounces@lists.mpi-forum.org" target="_blank">mpi3-ft-bounces@lists.mpi-forum.org</a> [mailto:<a href="mailto:mpi3-ft-bounces@lists.mpi-forum.org" target="_blank">mpi3-ft-bounces@lists.mpi-forum.org</a>]
<b>On Behalf Of </b>William Gropp<br>
<b>Sent:</b> Sunday, January 15, 2012 2:41 PM<br>
<b>To:</b> MPI 3.0 Fault Tolerance and Dynamic Process Control working Group<br>
<b>Subject:</b> Re: [Mpi3-ft] simplified FT proposal</span><u></u><u></u></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">One concern that I have with fault tolerant proposals has to do with races in the specification.  This is an area where users often "just want it to work" but getting it right is
 tricky.  In the example here, the "alive_group" is really only that at some moment shortly before "MPI_Comm_check" returns (and possibly not even that).  After that, it is really the "group_of_processes_that_was_alive_at_some_point_in_the_past".  Since there
 are sometimes correlations in failures, this could happen even if the initial failure is rare.  An alternate form might be to have a routine, collective over a communicator, that returns a new communicator meeting some definition of "members were alive at
 some point during construction".  It wouldn't guarantee you could use it, but it would have cleaner semantics.<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Bill<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div>
<p class="MsoNormal">On Jan 13, 2012, at 3:41 PM, Sur, Sayantan wrote:<u></u><u></u></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">I would like to argue for a simplified version of the proposal that covers a large percentage of use-cases and
 resists adding new “features” for the full-range of ABFT techniques. It is good if we have a more pragmatic view and not sacrifice the entire FT proposal for the 1% fringe cases. Most apps just want to do something like this:</span><u></u><u></u></p>


</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""> </span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">for(… really long time …) {</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">   MPI_Comm_check(work_comm, &is_ok, &alive_group);</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">   if(!is_ok) {</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">       MPI_Comm_create_group(alive_group, …, &new_comm);</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">      // re-balance workload and use new_comm in rest of computation</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">       MPI_Comm_free(work_comm); // get rid of old comm</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">       work_comm = new_comm;</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">   } else {</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">     // continue computation using work_comm</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">     // if some proc failed in this iteration, roll back work done in this iteration, go back to loop</span><u></u><u></u></p>


</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">   }</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">}</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""> </span><u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica","sans-serif"">William Gropp</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica","sans-serif"">Director, Parallel Computing Institute</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica","sans-serif"">Deputy Director for Research</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica","sans-serif"">Institute for Advanced Computing Applications and Technologies</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica","sans-serif"">Paul and Cynthia Saylor Professor of Computer Science</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica","sans-serif"">University of Illinois Urbana-Champaign</span><u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-size:13.5pt;font-family:"Helvetica","sans-serif""> </span><u></u><u></u></p>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><br>
_______________________________________________<br>
mpi3-ft mailing list<br>
<a href="mailto:mpi3-ft@lists.mpi-forum.org" target="_blank">mpi3-ft@lists.mpi-forum.org</a><br>
<a href="http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi3-ft" target="_blank">http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi3-ft</a><u></u><u></u></p>
</div>
<p class="MsoNormal"><br>
<br clear="all">
<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt">-- <br>
Tony Skjellum, PhD<br>
RunTime Computing Solutions, LLC<br>
<a href="mailto:tony@runtimecomputing.com" target="_blank">tony@runtimecomputing.com</a><br>
direct: <a href="tel:%2B1-205-314-3595" value="+12053143595" target="_blank">+1-205-314-3595</a><br>
cell: <a href="tel:%2B1-205-807-4968" value="+12058074968" target="_blank">+1-205-807-4968</a><u></u><u></u></p>
</div>
</div></div></div>
</div>
</div>

<br>_______________________________________________<br>
mpi3-ft mailing list<br>
<a href="mailto:mpi3-ft@lists.mpi-forum.org" target="_blank">mpi3-ft@lists.mpi-forum.org</a><br>
<a href="http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi3-ft" target="_blank">http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi3-ft</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Tony Skjellum, PhD<br>

RunTime Computing Solutions, LLC<br><a href="mailto:tony@runtimecomputing.com" target="_blank">tony@runtimecomputing.com</a><br>direct: <a href="tel:%2B1-205-314-3595" value="+12053143595" target="_blank">+1-205-314-3595</a><br>
cell: <a href="tel:%2B1-205-807-4968" value="+12058074968" target="_blank">+1-205-807-4968</a><br><br>
</div>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>Tony Skjellum, PhD<br>RunTime Computing Solutions, LLC<br><a href="mailto:tony@runtimecomputing.com">tony@runtimecomputing.com</a><br>direct: +1-205-314-3595<br>
cell: +1-205-807-4968<br><br>
</div>