Fix direct calls to SDAG entry methods 08/4908/3
authorJim Phillips <jim@ks.uiuc.edu>
Fri, 18 Jan 2019 16:52:13 +0000 (10:52 -0600)
committerDavid Hardy <dhardy@ks.uiuc.edu>
Tue, 29 Jan 2019 18:35:39 +0000 (12:35 -0600)
Directly calling SDAG entry methods that contain when clauses has
always had undefined behaviour, but Charm++ 6.9.0 now raises errors.
Now calls SDAG methods via proxy with callbacks to enforce order.

The error occurs when running the CUDA SMP build with multiple
processes on four or fewer physical nodes, as otherwise the
hard-coded heuristic falls back to the older PME since the newer
PME CUDA code does not scale well. Although this misuse of SDAG could
be caught as a compile-time error, Charm++ for some reason implements
as a run-time error.

Change-Id: Icf734a79daa3b3f6c5c0b70667fa782bcc40447e

src/CudaPmeSolver.C
src/CudaPmeSolver.ci
src/CudaPmeSolver.h
src/PmeSolver.C
src/PmeSolver.ci
src/PmeSolver.h

index 0e7a2eb..0338758 100644 (file)
@@ -136,8 +136,8 @@ void CudaPmePencilXY::initializeDevice(InitDeviceMsg *msg) {
 //
 // CUDA specific start
 //
-void CudaPmePencilXY::start() {
-  recvDeviceBuffers();
+void CudaPmePencilXY::start(const CkCallback &cb) {
+  thisProxy[thisIndex].recvDeviceBuffers(cb);
 }
 
 void CudaPmePencilXY::setDeviceBuffers() {
@@ -306,8 +306,8 @@ void CudaPmePencilX::initializeDevice(InitDeviceMsg *msg) {
 //
 // CUDA specific start
 //
-void CudaPmePencilX::start() {
-  recvDeviceBuffers();
+void CudaPmePencilX::start(const CkCallback &cb) {
+  thisProxy[thisIndex].recvDeviceBuffers(cb);
 }
 
 //
@@ -498,8 +498,8 @@ void CudaPmePencilY::initializeDevice(InitDeviceMsg2 *msg) {
 //
 // CUDA specific start
 //
-void CudaPmePencilY::start() {
-  recvDeviceBuffers();
+void CudaPmePencilY::start(const CkCallback &cb) {
+  thisProxy[thisIndex].recvDeviceBuffers(cb);
 }
 
 //
@@ -796,8 +796,8 @@ void CudaPmePencilZ::initializeDevice(InitDeviceMsg2 *msg) {
 //
 // CUDA specific start
 //
-void CudaPmePencilZ::start() {
-  recvDeviceBuffers();
+void CudaPmePencilZ::start(const CkCallback &cb) {
+  thisProxy[thisIndex].recvDeviceBuffers(cb);
 }
 
 void CudaPmePencilZ::setDeviceBuffers() {
index 440148c..d9056b4 100644 (file)
@@ -30,7 +30,7 @@ module CudaPmeSolver {
                        }
                };
                entry void recvDeviceBuffer(DeviceDataMsg *msg);
-               entry void recvDeviceBuffers() {
+               entry void recvDeviceBuffers(const CkCallback &cb) {
                        overlap {
                        for (imsg=0;imsg < numDeviceBuffers;++imsg) {
                                        when recvDeviceBuffer(DeviceDataMsg *msg) serial {
@@ -46,6 +46,7 @@ module CudaPmeSolver {
                                }
                        }
                        serial { setDeviceBuffers(); }
+                       serial { cb.send(); }
                };
        };
 
@@ -62,7 +63,7 @@ module CudaPmeSolver {
                        }
                };
                entry void recvDeviceBuffer(DeviceDataMsg *msg);
-               entry void recvDeviceBuffers() {
+               entry void recvDeviceBuffers(const CkCallback &cb) {
                        overlap {
                        for (imsgY=0;imsgY < numDeviceBuffers;++imsgY) {
                                        when recvDeviceBuffer(DeviceDataMsg *msg) serial {
@@ -78,6 +79,7 @@ module CudaPmeSolver {
                                }
                        }
                        serial { setDeviceBuffers(); }
+                       serial { cb.send(); }
                };
        };
 
@@ -101,7 +103,7 @@ module CudaPmeSolver {
                };
                entry void recvDeviceBufferZ(DeviceDataMsg *msg);
                entry void recvDeviceBufferX(DeviceDataMsg *msg);
-               entry void recvDeviceBuffers() {
+               entry void recvDeviceBuffers(const CkCallback &cb) {
                        overlap {
                        for (imsgZ=0;imsgZ < numDeviceBuffersZ;++imsgZ) {
                                        when recvDeviceBufferZ(DeviceDataMsg *msg) serial {
@@ -129,6 +131,7 @@ module CudaPmeSolver {
                                }
                        }
                        serial { setDeviceBuffers(); }
+                       serial { cb.send(); }
                };
        };
 
@@ -154,7 +157,7 @@ module CudaPmeSolver {
                        }                       
                };
                entry void recvDeviceBuffer(DeviceDataMsg *msg);
-               entry void recvDeviceBuffers() {
+               entry void recvDeviceBuffers(const CkCallback &cb) {
                        overlap {
                        for (imsgY=0;imsgY < numDeviceBuffers;++imsgY) {
                                        when recvDeviceBuffer(DeviceDataMsg *msg) serial {
@@ -175,10 +178,11 @@ module CudaPmeSolver {
                                }
                        }
                        serial { setDeviceBuffers(); }
+                       serial { cb.send(); }
                };
 
 
        };
 #endif // NAMD_CUDA
 
-};
\ No newline at end of file
+};
index 170cc96..d4b8175 100644 (file)
@@ -93,7 +93,7 @@ private:
        void forwardDone();
        void backwardDone();
        void recvDataFromZ(PmeBlockMsg *msg);
-       void start();
+       void start(const CkCallback &);
        void setDeviceBuffers();
        float2* getData(const int i, const bool sameDevice);
        int deviceID;
@@ -121,7 +121,7 @@ private:
        void forwardDone();
        void backwardDone();
        void recvDataFromY(PmeBlockMsg *msg);
-       void start();
+       void start(const CkCallback &);
        void setDeviceBuffers();
        float2* getData(const int i, const bool sameDevice);
        int deviceID;
@@ -150,7 +150,7 @@ private:
        void backwardDone();
        void recvDataFromX(PmeBlockMsg *msg);
        void recvDataFromZ(PmeBlockMsg *msg);
-       void start();
+       void start(const CkCallback &);
        void setDeviceBuffers();
        float2* getDataForX(const int i, const bool sameDevice);
        float2* getDataForZ(const int i, const bool sameDevice);
@@ -185,7 +185,7 @@ public:
 private:
        void backwardDone();
        void recvDataFromY(PmeBlockMsg *msg);
-       void start();
+       void start(const CkCallback &);
        void setDeviceBuffers();
        float2* getData(const int i, const bool sameDevice);
        int deviceID;
@@ -206,4 +206,4 @@ private:
 };
 
 #endif // NAMD_CUDA
-#endif //CUDAPMESOLVER_H
\ No newline at end of file
+#endif //CUDAPMESOLVER_H
index 51c451e..88cf431 100644 (file)
@@ -179,7 +179,7 @@ void PmePencilXY::recvDataFromZ(PmeBlockMsg *msg) {
   NAMD_bug("PmePencilXY::recvDataFromZ(), base class method called");
 }
 
-void PmePencilXY::start() {
+void PmePencilXY::start(const CkCallback &) {
   NAMD_bug("PmePencilXY::start(), base class method called");
 }
 
@@ -281,7 +281,7 @@ void PmePencilX::recvDataFromY(PmeBlockMsg *msg) {
   NAMD_bug("PmePencilX::recvDataFromY(), base class method called");
 }
 
-void PmePencilX::start() {
+void PmePencilX::start(const CkCallback &) {
   NAMD_bug("PmePencilX::start(), base class method called");
 }
 
@@ -355,7 +355,7 @@ void PmePencilY::recvDataFromZ(PmeBlockMsg *msg) {
   NAMD_bug("PmePencilY::recvDataFromZ(), base class method called");
 }
 
-void PmePencilY::start() {
+void PmePencilY::start(const CkCallback &) {
   NAMD_bug("PmePencilY::start(), base class method called");
 }
 
@@ -455,7 +455,7 @@ void PmePencilZ::recvDataFromY(PmeBlockMsg *msg) {
   NAMD_bug("PmePencilY::recvDataFromY(), base class method called");
 }
 
-void PmePencilZ::start() {
+void PmePencilZ::start(const CkCallback &) {
   NAMD_bug("PmePencilZ::start(), base class method called");
 }
 
index 390dcb8..ba9145d 100644 (file)
@@ -49,14 +49,16 @@ module PmeSolver {
 
   array[3D] PmePencilXY {
     entry PmePencilXY();
+    entry void startDoneCallback();
     entry void chargeGridReady(PmeRunMsg *msg);
     entry void recvBlock(PmeBlockMsg *msg);
     entry void start(PmeStartMsg *pmeStartMsg) {
       serial "initFFT" {
         initFFT(pmeStartMsg); 
         delete pmeStartMsg;
-        start();
+        start(CkCallback(CkIndex_PmePencilXY::startDoneCallback(), thisProxy[thisIndex]));
       }
+      when startDoneCallback() serial {}
       while (true) {
         when chargeGridReady(PmeRunMsg *msg) serial "forwardFFT" {
           doEnergy = msg->doEnergy;
@@ -85,14 +87,16 @@ module PmeSolver {
 
   array[3D] PmePencilX {
     entry PmePencilX();
+    entry void startDoneCallback();
     entry void chargeGridReady(PmeRunMsg *msg);
     entry void recvBlock(PmeBlockMsg *msg);
     entry void start(PmeStartMsg *pmeStartMsg) {
       serial "initFFT" {
         initFFT(pmeStartMsg); 
         delete pmeStartMsg;
-        start();
+        start(CkCallback(CkIndex_PmePencilX::startDoneCallback(), thisProxy[thisIndex]));
       }
+      when startDoneCallback() serial {}
       while (true) {
         when chargeGridReady(PmeRunMsg *msg) serial "forwardFFT" {
           doEnergy = msg->doEnergy;
@@ -121,13 +125,15 @@ module PmeSolver {
 
   array[3D] PmePencilY {
     entry PmePencilY();
+    entry void startDoneCallback();
     entry void recvBlock(PmeBlockMsg *msg);
     entry void start(PmeStartMsg *pmeStartMsg) {
       serial "initFFT" {
         initFFT(pmeStartMsg); 
         delete pmeStartMsg;
-        start();
+        start(CkCallback(CkIndex_PmePencilY::startDoneCallback(), thisProxy[thisIndex]));
       }
+      when startDoneCallback() serial {}
       while (true) {
         for (imsg=0;imsg < pmeGrid.yBlocks;++imsg) {
           when recvBlock(PmeBlockMsg *msg) serial "recvDataFromX" {
@@ -161,14 +167,16 @@ module PmeSolver {
 
   array[3D] PmePencilZ {
     entry PmePencilZ();
+    entry void startDoneCallback();
     entry void recvBlock(PmeBlockMsg *msg);
     entry void skip();
     entry void start(PmeStartMsg *pmeStartMsg) {
       serial "initFFT" {
         initFFT(pmeStartMsg); 
         delete pmeStartMsg;
-        start();
+        start(CkCallback(CkIndex_PmePencilZ::startDoneCallback(), thisProxy[thisIndex]));
       }
+      when startDoneCallback() serial {}
       while (true) {
         for (imsg=0;imsg < pmeGrid.zBlocks;++imsg) {
           when recvBlock(PmeBlockMsg *msg) serial "recvDataFromY" {
index cf0d6e5..58d8743 100644 (file)
@@ -177,7 +177,7 @@ private:
   virtual void forwardDone();
   virtual void backwardDone();
   virtual void recvDataFromZ(PmeBlockMsg *msg);
-  virtual void start();
+  virtual void start(const CkCallback &);
 
 };
 
@@ -204,7 +204,7 @@ private:
   virtual void forwardDone();
   virtual void backwardDone();
   virtual void recvDataFromY(PmeBlockMsg *msg);
-  virtual void start();
+  virtual void start(const CkCallback &);
 
 };
 
@@ -232,7 +232,7 @@ private:
   virtual void backwardDone();
   virtual void recvDataFromX(PmeBlockMsg *msg);
   virtual void recvDataFromZ(PmeBlockMsg *msg);
-  virtual void start();
+  virtual void start(const CkCallback &);
 
 };
 
@@ -262,7 +262,7 @@ private:
   void initFFT(PmeStartMsg *msg);
   virtual void backwardDone();
   virtual void recvDataFromY(PmeBlockMsg *msg);
-  virtual void start();
+  virtual void start(const CkCallback &);
 
   SubmitReduction* reduction;