Disable incompatible CUDA kernels 29/4429/1
authorDavid <dhardy@ks.uiuc.edu>
Wed, 1 Aug 2018 22:06:55 +0000 (17:06 -0500)
committerDavid <dhardy@ks.uiuc.edu>
Wed, 1 Aug 2018 22:06:55 +0000 (17:06 -0500)
Automatically disable particular CUDA kernels that are incompatible with
certain simulation options.  Specifically, disable CUDA bonds for Drude,
disable CUDA dihedrals and crossterms for accelMDdihe and accelMDdual,
and disable PMECUDA for REST2.  This action is controlled by
undocumented SimParameter useCUDAdisable, defaulting to TRUE to enable
the disabling.

Tested successfully for REST2 test system, Drude water and decane
systems, and accelMD applied to ApoA1.

Change-Id: I380a5a2bfadeb0ba2a791b2c7c29cdad66405cab

src/SimParameters.C
src/SimParameters.h

index f3757b1..4d3a40d 100644 (file)
@@ -2347,6 +2347,11 @@ void SimParameters::config_parser_misc(ParseOptions &opts) {
    // Bonded interactions on GPU
    opts.optional("main", "bondedCUDA", "Bitmask for calculating bonded interactions on GPU", &bondedCUDA, 255);
 
+   // Automatically disable individual CUDA kernels that are
+   // incompatible with simulation options.
+   // Set FALSE to manually control kernel use for development.
+   opts.optionalB("main", "useCUDAdisable", "Disable kernels to maintain feature compatibility with CUDA", &useCUDAdisable, TRUE);
+
    // MIC specific parameters
    opts.optional("main", "mic_unloadMICPEs", "Indicates whether or not the load balancer should unload PEs driving Xeon Phi cards", &mic_unloadMICPEs, 1);
    opts.optional("main", "mic_singleKernel", "Set to non-zero to have all MIC work to be placed in a single kernel", &mic_singleKernel, 1);
@@ -3984,6 +3989,10 @@ void SimParameters::check_config(ParseOptions &opts, ConfigList *config, char *&
      //     iout << iWARN << "Disabling usePMECUDA because of non-orthorhombic periodic cell.\n" << endi;
      //   }
      // }
+     if ( usePMECUDA && soluteScalingOn && useCUDAdisable ) {
+       usePMECUDA = 0;
+       iout << iWARN << "Disabling usePMECUDA due to incompatibility with soluteScaling.\n" << endi;
+     }
 #else
      PMEOffload = 0;
 #endif
@@ -4497,6 +4506,23 @@ void SimParameters::check_config(ParseOptions &opts, ConfigList *config, char *&
         if (qmCSMD && (! opts.defined("QMCSMDFile") ))
             NAMD_die("QM Conditional SMD is ON, but no CSMD configuration file was profided!");
     }
+
+#ifdef NAMD_CUDA
+    // Disable various CUDA kernels if they do not fully support
+    // or are otherwise incompatible with simulation options.
+    if ( useCUDAdisable ) {
+      if ( drudeOn && useCUDA2 && (bondedCUDA & 0x0001) ) {
+        // disable CUDA kernels for spring bonds
+        bondedCUDA &= ~0x0001;
+        iout << iWARN << "Disabling CUDA kernel for bonds due to incompatibility with Drude oscillators.\n";
+      }
+      if ( accelMDOn && (accelMDdihe || accelMDdual) && useCUDA2 && (bondedCUDA & (0x0004 | 0x0020)) ) {
+        // disable CUDA kernels for dihedrals and crossterms
+        bondedCUDA &= ~(0x0004 | 0x0020);
+        iout << iWARN << "Disabling CUDA kernels for dihedrals and crossterms due to incompatibility with accelerated MD options.\n";
+      }
+    }
+#endif
 }
 
 void SimParameters::print_config(ParseOptions &opts, ConfigList *config, char *&cwd) {
index 7c4cab0..efdc029 100644 (file)
@@ -773,9 +773,30 @@ public:
         Bool PMEOffload;               //  Offload reciprocal sum to accelerator
 
        Bool useDPME;                   //  Flag TRUE -> old DPME code
-       Bool usePMECUDA;                //  Flag TRUE -> use the PME CUDA version
-       Bool useCUDA2;                  //  Flag TRUE -> use ComputeNonbondedCUDA2
-  int bondedCUDA;                 //  Bitmask for calculating bonded interactions on GPU
+
+       Bool usePMECUDA;
+        /**< Flag TRUE to use the PME CUDA version.
+         * Default is TRUE if running on 4 nodes or less. */
+
+       Bool useCUDA2;
+        /**< Flag TRUE to use the second generation nonbonded
+         * CUDA kernels developed by Antti-Pekka Hynninen.
+         * Default is TRUE. */
+
+        int bondedCUDA;
+        /**< Bitmask for calculating bonded interactions on GPU.
+         * Default is 255, with the following bit position settings:
+         * 1 -> bonds, 2 -> angles, 4 -> dihedrals, 8 -> impropers,
+         * 16 -> exclusions, 32 -> crossterms. */
+
+        Bool useCUDAdisable;
+        /**< Flag TRUE to automatically disable individual CUDA kernels that
+         * are incompatible with simulation options.  Default is TRUE.
+         * Specifically, disable CUDA bonds for Drude oscillator simulation
+         * and disable CUDA dihedral and CUDA crossterms kernels for
+         * accelMDdihe and accelMDdual simulation.
+         * Set FALSE to manually control kernel use for development. */
+
        Bool useOptPME;                 //  Flag TRUE -> use the scalable version of PME
        Bool useManyToMany;             //  Flag TRUE -> use the manytomany optimization of PME. 
                                        //  This flag requres useOptPME to be set.