<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:times new roman, new york, times, serif;font-size:12pt"><DIV><BR></DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">D,</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">thanks for the info.&nbsp; I will check with the engineer implementinig this thread comm</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">feature.&nbsp;&nbsp;&nbsp; I will keep you posted.</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">A side note.&nbsp; We also try a different strategy by calling IRecv in the master process</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">right after it has recieved and applied all data from 'slave process', like this, in non-threaded</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">mode&nbsp;:</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; master :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; slave :</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">TOP :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TOP : </DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; MPI_Wait_all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI_Send (to master)</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; for all slave&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI_Recv( from master )</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI_Send</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; appy-data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; apply-data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; for all slave</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI_Irecv()</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; do works&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do works</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; repeat&nbsp;TOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeat TOP<BR></DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">compared to brute forced blocked Recv,&nbsp; this Irecv and wait-all can cause performance</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">loss of 5%.&nbsp;&nbsp; </DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">tan</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;</DIV>
<DIV style="FONT-FAMILY: times new roman, new york, times, serif; FONT-SIZE: 12pt">&nbsp;</DIV>
<DIV style="FONT-FAMILY: arial, helvetica, sans-serif; FONT-SIZE: 13px"><FONT size=2 face=Tahoma>
<HR SIZE=1>
<B><SPAN style="FONT-WEIGHT: bold">From:</SPAN></B> Darius Buntinas &lt;buntinas@mcs.anl.gov&gt;<BR><B><SPAN style="FONT-WEIGHT: bold">To:</SPAN></B> mpich-discuss@mcs.anl.gov<BR><B><SPAN style="FONT-WEIGHT: bold">Sent:</SPAN></B> Friday, July 24, 2009 8:37:39 AM<BR><B><SPAN style="FONT-WEIGHT: bold">Subject:</SPAN></B> Re: [mpich-discuss] thread MPI calls<BR></FONT><BR><BR>Hi Tan,<BR><BR>Did your program call MPI_Init_thread, or MPI_Init?&nbsp; If you called<BR>MPI_Init_thread, what thread level did you request?<BR><BR>Based on what thread level you selected, MPICH will enable internal<BR>thread safety.&nbsp; Without looking at the code, I believe that (at least<BR>for the unix implementation) the internal thread safety mechanism is<BR>only enabled with the thread multiple level, so the performance of<BR>using, say, thread funneled should be the same as using thread single<BR>(or just callin MPI_Init rather than MPI_Init_thread).<BR><BR>-d<BR><BR>On
 07/23/2009 05:40 PM, chong tan wrote:<BR>&gt; box X86 box running Linux.&nbsp; MPICH2 1.1 configured with<BR>&gt;&nbsp; <BR>&gt;&nbsp; --disable-f77 --disable-f90 --with-device=ch3:nemesis&nbsp; --enable-fast<BR>&gt;&nbsp; <BR>&gt; machine : 16 cores, load of mem.&nbsp; running&nbsp; with mpiexec -n 4<BR>&gt; The master process (MPICH rank 0) has 2 thread, main and recv, the<BR>&gt; locks are constructed using pthread.&nbsp; The master's<BR>&gt; recv function wait for the recv thread to be done with all recieving,<BR>&gt; then process the data, and reenable the recv thread,<BR>&gt; like this:<BR>&gt;&nbsp; <BR>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; main&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; recv thread<BR>&gt;&nbsp; <BR>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; recvFunc() {&nbsp; &nbsp; &nbsp; &nbsp;
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wait for 'run' <BR>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wait for read-done&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for n processes<BR>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; apply data&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <BR>&gt; call MPI_IRecv<BR>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; signal run&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MPI_waitall<BR>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
 &nbsp; &nbsp; &nbsp; <BR>&gt; signal read-done<BR>&gt;&nbsp; &nbsp; &nbsp; &nbsp; <BR>&gt; recvFunc is repeatedly called during the life of my applications.&nbsp; (In a<BR>&gt; few tests I have, it is called 100+ billion times)<BR>&gt;&nbsp; <BR>&gt; compared to the same application with no thread and using IRecv or Recv,<BR>&gt; the threaded version can run 20+%<BR>&gt; slower.&nbsp; From the process monitoring, it looks like the MPI Irecv calls<BR>&gt; maybe thread. This performance degration<BR>&gt; is inline with 2.0.6 configured using --enable-threads=funneled.&nbsp; The<BR>&gt; application ran for many hours, so 20% is<BR>&gt; significant.<BR>&gt;&nbsp; <BR>&gt; Questions :<BR>&gt; -&nbsp; is MPICH2 1.1 self-sensing ?&nbsp; that is, does it know it can decide if<BR>&gt; it has to do thread-multiple ?<BR>&gt; -&nbsp; IRecv and MPI wait all, is that also threaded ?<BR>&gt; -&nbsp; anyone experimented this before ?<BR>&gt;&nbsp; <BR>&gt;
 thanks<BR>&gt; tan<BR>&gt;&nbsp; <BR>&gt; ------------------------------------------------------------------------<BR>&gt; *From:* Rajeev Thakur &lt;<A href="mailto:thakur@mcs.anl.gov" ymailto="mailto:thakur@mcs.anl.gov">thakur@mcs.anl.gov</A>&gt;<BR>&gt; *To:* <A href="mailto:mpich-discuss@mcs.anl.gov" ymailto="mailto:mpich-discuss@mcs.anl.gov">mpich-discuss@mcs.anl.gov</A><BR>&gt; *Sent:* Friday, June 26, 2009 12:12:18 PM<BR>&gt; *Subject:* Re: [mpich-discuss] does 1.1 support real threading of MPI call ?<BR>&gt; <BR>&gt; Yes, it supports MPI_THREAD_MULTIPLE as defined by the MPI standard.<BR>&gt;&nbsp; <BR>&gt; Rajeev<BR>&gt; <BR>&gt;&nbsp; &nbsp; ------------------------------------------------------------------------<BR>&gt;&nbsp; &nbsp; *From:* <A href="mailto:mpich-discuss-bounces@mcs.anl.gov" ymailto="mailto:mpich-discuss-bounces@mcs.anl.gov">mpich-discuss-bounces@mcs.anl.gov</A><BR>&gt;&nbsp; &nbsp; [mailto:<A
 href="mailto:mpich-discuss-bounces@mcs.anl.gov" ymailto="mailto:mpich-discuss-bounces@mcs.anl.gov">mpich-discuss-bounces@mcs.anl.gov</A>] *On Behalf Of *chong tan<BR>&gt;&nbsp; &nbsp; *Sent:* Friday, June 26, 2009 2:04 PM<BR>&gt;&nbsp; &nbsp; *To:* <A href="mailto:mpich-discuss@mcs.anl.gov" ymailto="mailto:mpich-discuss@mcs.anl.gov">mpich-discuss@mcs.anl.gov</A><BR>&gt;&nbsp; &nbsp; *Subject:* [mpich-discuss] does 1.1 support real threading of MPI call ?<BR>&gt; <BR>&gt;&nbsp; &nbsp; Does anyone know if the 1.1 release supports real threaded MPI<BR>&gt;&nbsp; &nbsp; calls.&nbsp; That is,<BR>&gt;&nbsp; &nbsp; a process, say 1, may contain n threads, and each calling<BR>&gt;&nbsp; &nbsp; MPI_Send/Recv to<BR>&gt;&nbsp; &nbsp; other processes, but still think they are all process 1 ?<BR>&gt;&nbsp; &nbsp; &nbsp; <BR>&gt;&nbsp; &nbsp; I am not looking at the funneled solution, that does not help me.<BR>&gt;&nbsp; &nbsp; &nbsp; <BR>&gt;&nbsp; &nbsp;
 thanks<BR>&gt;&nbsp; &nbsp; tan<BR>&gt; <BR>&gt;&nbsp; &nbsp; &nbsp; <BR>&gt; <BR>&gt; <BR>&gt; <BR></DIV></div><br>

      </body></html>