Fix bad CUDA forces with with oversized periodic cell 29/4629/1
authorJim Phillips <jim@ks.uiuc.edu>
Fri, 28 Sep 2018 17:14:33 +0000 (12:14 -0500)
committerJim Phillips <jim@ks.uiuc.edu>
Fri, 28 Sep 2018 17:14:33 +0000 (12:14 -0500)
The newer tile-based streaming nonbonded kernel (useCuda2 yes)
skips copying forces to the host for patches that have no
interacting tile pairs.  This can leave stale or uninitialized
force data on the host that is copied to the patch forces.
Fix is to initialize host force data to zero for such patches.

Symptom is eventual instability in the simulation, although
pressure in a deterministic run diverges after first cycle.
This has only been observed on a large parallel run with many
nearly empty patches due to an oversized periodic cell,
such that a patch could have only atoms that are outside the
tile pairlist distance for any interactions on the same GPU.
Workarounds include +nostreaming flag or useCuda2 no option.

Change-Id: Ie4a26905acf65d74332e2f2779ec1428f763a70a

src/CudaComputeNonbonded.C

index ee95b0c..dae8ada 100644 (file)
@@ -1027,6 +1027,9 @@ void CudaComputeNonbonded::launchWork() {
       int numEmptyPatches = tileListKernel.getNumEmptyPatches();
       int* emptyPatches = tileListKernel.getEmptyPatches();
       for (int i=0;i < numEmptyPatches;i++) {
+        PatchRecord &pr = patches[emptyPatches[i]];
+        memset(h_forces+pr.atomStart, 0, sizeof(float4)*pr.numAtoms);
+        if (doSlow) memset(h_forcesSlow+pr.atomStart, 0, sizeof(float4)*pr.numAtoms);
         patchReadyQueue[i] = emptyPatches[i];
       }
       if (patchReadyQueueLen != patches.size())