Fix REST2 CUDA update of LJTable 06/4406/4
authorJulio Maia <jmaia@ks.uiuc.edu>
Fri, 27 Jul 2018 16:41:56 +0000 (11:41 -0500)
committerDavid Hardy <dhardy@ks.uiuc.edu>
Sat, 28 Jul 2018 14:59:29 +0000 (09:59 -0500)
REST2 CUDA updates LJTables for A-P's kernels, contributed by Julio Maia.
Update the table values in device memory without changing the memory
allocation, destroy and recreate the CUDA texture object.  The update is
driven by SimParameters called from Tcl script with an update to
soluteScalingFactor or soluteScalingFactorVdw.  From rank 0, update
ComputeNonbondedUtil through select() to rebuild LJTable for CPU and then
update CudaNonbondedTables on all CUDA devices through the node group
instance of ComputeCUDAMgr.

Change-Id: Ib88b0e84c95ef145f191f403534f0b53851fc89a

src/ComputeCUDAMgr.C
src/ComputeCUDAMgr.h
src/ComputeHomeTuples.h
src/ComputeNonbondedUtil.C
src/CudaNonbondedTables.C
src/CudaNonbondedTables.h
src/SimParameters.C

index b93cec9..febdb8d 100644 (file)
@@ -67,6 +67,19 @@ void ComputeCUDAMgr::initialize(CkQdMsg *msg) {
   }
 }
 
+//
+// Update nonbonded tables
+// Should be called only on rank 0 of each node
+//
+void ComputeCUDAMgr::update() {
+  if ( CkMyRank() ) NAMD_bug("ComputeCUDAMgr::update() should be called only by rank 0");
+  for (int i=0;  i < deviceCUDA->getNumDevice();  i++) {
+    int deviceID = deviceCUDA->getDeviceIDbyRank(i);
+    // calls update function from CudaNonbondedTables
+    cudaNonbondedTablesList[deviceID]->updateTables();
+  }
+}
+
 ComputeCUDAMgr* ComputeCUDAMgr::getComputeCUDAMgr() {
   // Get pointer to ComputeCUDAMgr on this node
   CProxy_ComputeCUDAMgr computeCUDAMgrProxy = CkpvAccess(BOCclass_group).computeCUDAMgr;
index 7e291aa..c3c7cd3 100644 (file)
 class ComputeCUDAMgr : public CBase_ComputeCUDAMgr {
 public:
   // ComputeCUDAMgr_SDAG_CODE;
-       ComputeCUDAMgr();
-       ComputeCUDAMgr(CkMigrateMessage *);
-       ~ComputeCUDAMgr();
-       void initialize(CkQdMsg *msg);
-       void initialize_devices(CkQdMsg *msg);
+  ComputeCUDAMgr();
+  ComputeCUDAMgr(CkMigrateMessage *);
+  ~ComputeCUDAMgr();
+  void initialize(CkQdMsg *msg);
+  void initialize_devices(CkQdMsg *msg);
+  void update();
   static ComputeCUDAMgr* getComputeCUDAMgr();
   CudaComputeNonbonded* createCudaComputeNonbonded(ComputeID c);
   CudaComputeNonbonded* getCudaComputeNonbonded();
@@ -42,4 +43,4 @@ class ComputeCUDAMgr : public CBase_ComputeCUDAMgr {
 };
 
 #endif // NAMD_CUDA
-#endif // COMPUTECUDAMGR_H
\ No newline at end of file
+#endif // COMPUTECUDAMGR_H
index c508429..2da405d 100644 (file)
@@ -24,7 +24,6 @@
 #include "SimParameters.h"
 #include "PatchMap.inl"
 #include "AtomMap.h"
-#include "ComputeHomeTuples.h"
 #include "PatchMgr.h"
 #include "ProxyMgr.h"
 #include "HomePatchList.h"
index 9907347..d84b830 100644 (file)
@@ -515,6 +515,10 @@ void ComputeNonbondedUtil::select(void)
 //fepe
 
   dielectric_1 = 1.0/simParams->dielectric;
+  if ( simParams->soluteScalingOn ) {
+    delete ljTable;
+    ljTable = 0;
+  }
   if ( ! ljTable ) ljTable = new LJTable;
   mol = Node::Object()->molecule;
   scaling = simParams->nonbondedScaling;
index dddcea5..28d948c 100644 (file)
@@ -47,9 +47,14 @@ CudaNonbondedTables::~CudaNonbondedTables() {
 }
 
 template <typename T>
-void bindTextureObject(int size, T* h_table, T*& d_table, cudaTextureObject_t& tex) {
+void bindTextureObject(int size, T* h_table, T*& d_table, cudaTextureObject_t& tex, bool update=false) {
   // Copy to device
-  allocate_device<T>(&d_table, size);
+  if ( ! update) {
+    allocate_device<T>(&d_table, size);
+  }
+  else {
+    cudaCheck(cudaDestroyTextureObject(tex));
+  }
   copy_HtoD_sync<T>(h_table, d_table, size);
 
   // Create texture object
@@ -75,7 +80,7 @@ void bindTextureObject(int size, T* h_table, T*& d_table, cudaTextureObject_t& t
 // Builds the VdW Lennard-Jones coefficient table. Swiped from ComputeNonbondedCUDA.C
 // NOTE: Can only be called once
 //
-void CudaNonbondedTables::buildVdwCoefTable() {
+void CudaNonbondedTables::buildVdwCoefTable(bool update/*=false*/) {
 
   const LJTable* const ljTable = ComputeNonbondedUtil:: ljTable;
   const int dim = ljTable->get_table_dim();
@@ -100,8 +105,8 @@ void CudaNonbondedTables::buildVdwCoefTable() {
 
   vdwCoefTableWidth = tsize;
 
-  bindTextureObject<float2>(tsize*tsize, h_vdwCoefTable, vdwCoefTable, vdwCoefTableTex);
-  bindTextureObject<float2>(tsize*tsize, h_exclusionVdwCoefTable, exclusionVdwCoefTable, exclusionVdwCoefTableTex);
+  bindTextureObject<float2>(tsize*tsize, h_vdwCoefTable, vdwCoefTable, vdwCoefTableTex, update);
+  bindTextureObject<float2>(tsize*tsize, h_exclusionVdwCoefTable, exclusionVdwCoefTable, exclusionVdwCoefTableTex, update);
 
   delete [] h_vdwCoefTable;
   delete [] h_exclusionVdwCoefTable;
@@ -111,6 +116,11 @@ void CudaNonbondedTables::buildVdwCoefTable() {
   }
 }
 
+// Update tables from newer CPU values
+void CudaNonbondedTables::updateTables() {
+  buildVdwCoefTable(true);
+}
+
 //
 // Builds force and energy tables. Swiped from ComputeNonbondedCUDA.C
 //
@@ -281,4 +291,4 @@ void CudaNonbondedTables::buildForceAndEnergyTables(int tableSize) {
   delete [] r2list;
 }
 
-#endif // NAMD_CUDA
\ No newline at end of file
+#endif // NAMD_CUDA
index ec82585..00d15ad 100644 (file)
@@ -41,7 +41,7 @@ private:
   cudaTextureObject_t exclusionTableTex;
   cudaTextureObject_t r2_table_tex;
 
-  void buildVdwCoefTable();
+  void buildVdwCoefTable(bool update=false);
   void buildForceAndEnergyTables(int tableSize);
 
 public:
@@ -54,6 +54,8 @@ public:
   cudaTextureObject_t getForceTableTex() {return forceTableTex;}
   cudaTextureObject_t getEnergyTableTex() {return energyTableTex;}
 
+  void updateTables();
+
   float2* getExclusionVdwCoefTable() {return exclusionVdwCoefTable;}
   cudaTextureObject_t getExclusionVdwCoefTableTex() {return exclusionVdwCoefTableTex;}
   // cudaTextureObject_t getExclusionForceTableTex() {return exclusionForceTableTex;}
@@ -69,4 +71,4 @@ public:
 };
 
 #endif // NAMD_CUDA
-#endif // CUDANONBONDEDTABLES_H
\ No newline at end of file
+#endif // CUDANONBONDEDTABLES_H
index 5c42860..532cbe2 100644 (file)
@@ -21,6 +21,7 @@
 #include "ComputeNonbondedUtil.h"
 #include "LJTable.h"
 #include "ComputePme.h"
+#include "ComputeCUDAMgr.h"
 #include "ConfigList.h"
 #include "SimParameters.h"
 #include "ParseOptions.h"
@@ -405,8 +406,12 @@ void SimParameters::scriptSet(const char *param, const char *value) {
     }
     soluteScalingFactorCharge = soluteScalingFactor;
     soluteScalingFactorVdw = soluteScalingFactor;
-    if ( ComputeNonbondedUtil::ljTable ) delete ComputeNonbondedUtil::ljTable;
-    ComputeNonbondedUtil::ljTable = new LJTable;
+    // update LJTable for CPU
+    ComputeNonbondedUtil::select();
+#ifdef NAMD_CUDA
+    // update LJTable for GPU, needs CPU update first
+    ComputeCUDAMgr::getComputeCUDAMgr()->update();
+#endif
     return;
   }
   if ( ! strncasecmp(param,"soluteScalingFactorVdw",MAX_SCRIPT_PARAM_SIZE)) {
@@ -415,8 +420,12 @@ void SimParameters::scriptSet(const char *param, const char *value) {
       NAMD_die("Solute scaling factor for van der Waals "
           "should be non-negative\n");
     }
-    if ( ComputeNonbondedUtil::ljTable ) delete ComputeNonbondedUtil::ljTable;
-    ComputeNonbondedUtil::ljTable = new LJTable;
+    // update LJTable for CPU
+    ComputeNonbondedUtil::select();
+#ifdef NAMD_CUDA
+    // update LJTable for GPU, needs CPU update first
+    ComputeCUDAMgr::getComputeCUDAMgr()->update();
+#endif
     return;
   }
   if ( ! strncasecmp(param,"soluteScalingFactorCharge",MAX_SCRIPT_PARAM_SIZE)) {