Activate mixed mode of PME on GPU
authorAleksei Iupinov <a.yupinov@gmail.com>
Wed, 22 Nov 2017 09:52:40 +0000 (10:52 +0100)
committerMark Abraham <mark.j.abraham@gmail.com>
Fri, 24 Nov 2017 17:13:52 +0000 (18:13 +0100)
Thsi allows the mixed PME mode (spread/gather on GPU, FFT/solve on CPU)
to be triggered manually with -pme gpu -pmefft cpu. Behavior of other
values of -pme and -pmefft is not altered. Testing is enabled as well.

Change-Id: I2a525e2a7003a392629b2ca2ed4051d9245dac1b

src/programs/mdrun/runner.cpp
src/programs/mdrun/tests/pmetest.cpp

index 1c0e019ee5d68c690ef29115f81f6b8de11c62b6..487eb3a5a0267d84f1d4453531b2ce661a637d02 100644 (file)
@@ -484,12 +484,10 @@ int Mdrunner::mdrunner()
         userGpuTaskAssignment = parseUserGpuIds(hw_opt.userGpuTaskAssignment);
     }
     GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR;
-    auto             nonbondedTarget = findTaskTarget(nbpu_opt);
-    auto             pmeTarget       = findTaskTarget(pme_opt);
-    // TODO find a sensible home and behaviour for this
-    GMX_UNUSED_VALUE(pme_fft_opt);
-    //auto pmeFftTarget    = findTaskTarget(pme_fft_opt);
-    PmeRunMode pmeRunMode = PmeRunMode::None;
+    auto       nonbondedTarget = findTaskTarget(nbpu_opt);
+    auto       pmeTarget       = findTaskTarget(pme_opt);
+    auto       pmeFftTarget    = findTaskTarget(pme_fft_opt);
+    PmeRunMode pmeRunMode      = PmeRunMode::None;
 
     // Here we assume that SIMMASTER(cr) does not change even after the
     // threads are started.
@@ -655,8 +653,11 @@ int Mdrunner::mdrunner()
         auto inputSystemHasPme = EEL_PME(inputrec->coulombtype) || EVDW_PME(inputrec->vdwtype);
         auto canUseGpuForPme   = inputSystemHasPme && pme_gpu_supports_input(inputrec, nullptr);
         useGpuForPme = decideWhetherToUseGpusForPme(useGpuForNonbonded, pmeTarget, userGpuTaskAssignment, canUseGpuForPme, cr->nnodes);
-        // FIXME decide how to implement -pmefft support
-        pmeRunMode = (useGpuForPme ? PmeRunMode::GPU : PmeRunMode::CPU);
+        pmeRunMode   = (useGpuForPme ? PmeRunMode::GPU : PmeRunMode::CPU);
+        if ((pmeRunMode == PmeRunMode::GPU) && (pmeFftTarget == TaskTarget::Cpu))
+        {
+            pmeRunMode = PmeRunMode::Hybrid;
+        }
     }
     GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR;
 
index 7f73607b93dd8a594914c0e0c3f3a27568cbc5b9..b91d71d543ce95310a1099cd2a6550642adad196 100644 (file)
@@ -115,10 +115,9 @@ TEST_F(PmeTest, ReproducesEnergies)
 
     //TODO test all proper/improper combinations in more thorough way?
     std::map < std::string, std::vector < const char *>> runModes;
-    runModes["PmeOnCpu"] = {"-pme", "cpu"};
-    runModes["PmeAuto"]  = {"-pme", "auto"};
-    // TODO uncomment this when functionality gets activated.
-    //runModes["PmeOnGpuFftOnCpu"] = {"-pme", "gpu", "-pmefft", "cpu"};
+    runModes["PmeOnCpu"]         = {"-pme", "cpu"};
+    runModes["PmeAuto"]          = {"-pme", "auto"};
+    runModes["PmeOnGpuFftOnCpu"] = {"-pme", "gpu", "-pmefft", "cpu"};
     runModes["PmeOnGpuFftOnGpu"] = {"-pme", "gpu", "-pmefft", "gpu"};
     runModes["PmeOnGpuFftAuto"]  = {"-pme", "gpu", "-pmefft", "auto"};
     TestReferenceData    refData;