freepooma-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Fix reductions for MPI operation


From: Richard Guenther
Subject: [PATCH] Fix reductions for MPI operation
Date: Sat, 21 Aug 2004 22:13:32 +0200
User-agent: Mozilla Thunderbird 0.7.3 (X11/20040820)


This patch fixes (works around) a previously discovered problem (remember the WaitingIterate). I'm sure there is a real problem
to fix (at least for MPI - I'm not sure about Cheetah), and this
is the least intrusive way of fixing it until the right idea for
a cross-context csem like mechanism pops up.

Without this patch random lockups during reductions may occour.

Ok?

Richard.


2004Aug21  Richard Guenther <address@hidden>

        * src/Engine/RemoteEngine.h: For MPI avoid doing blocking
        operation during reductions while iterates are still pending.
Index: src/Engine/RemoteEngine.h
===================================================================
RCS file: /home/pooma/Repository/r2/src/Engine/RemoteEngine.h,v
retrieving revision 1.42
diff -u -u -r1.42 RemoteEngine.h
--- src/Engine/RemoteEngine.h   19 Jan 2004 22:04:33 -0000      1.42
+++ src/Engine/RemoteEngine.h   21 Aug 2004 20:10:06 -0000
@@ -2065,6 +2065,11 @@
     Pooma::scheduler().endGeneration();
 
     csem.wait();
+#if POOMA_MPI
+    // The above single thread waiting has the same problem as with
+    // the MultiPatch variant.  So fix it.
+    Pooma::blockAndEvaluate();
+#endif
 
     RemoteProxy<T> globalRet(ret, computationContext);
     ret = globalRet;  
@@ -2186,6 +2191,27 @@
 
     Pooma::scheduler().endGeneration();
     csem.wait();
+#if POOMA_MPI
+    // We need to wait for Reductions on _all_ contexts to complete
+    // here, as we may else miss to issue a igc update send iterate that a
+    // remote context waits for.  Consider the 2-patch setup
+    //  a,b     |         g|  |          g|
+    // with the expressions
+    //  a(I) = b(I+1);
+    //  bool res = all(a(I) == 0);
+    // here we issue the following iterates:
+    //  0: guard receive from 1 (write request b)
+    //  1: guard send to 0      (read request b)
+    //  0/1: expression iterate (read request b, write request a)
+    //  0/1: reduction (read request a)
+    //  0/1: blocking MPI_XXX
+    // here the guard send from 1 to 0 can be skipped starting the
+    // blocking MPI operation prematurely while context 0 needs to
+    // wait for this send to complete in order to execute the expression.
+    //
+    // The easiest way (and the only available) is to blockAndEvaluate().
+    Pooma::blockAndEvaluate();
+#endif
 
     if (n > 0)
       {

reply via email to

[Prev in Thread] Current Thread [Next in Thread]