# Comment line(s) preceding each configuration document the main
# intent behind that configuration, so that we can correctly judge
# whether to preserve that during maintenance decisions.
-#
-# Both configurations currently target bs_nix1204, for better load
-# balance with pre-submit matrix, which makes heavier use of
-# bs_nix1310 agent.
-# Test newest gcc supported by newest CUDA at time of release
-# Test thread-MPI with CUDA
-# Test GPU update-constraints features in the above combination
+# Test GPU update-constraints features on a single PP+PME rank
gcc-8 gpuhw=nvidia nranks=1 gpu_id=1 cuda-10.1 thread-mpi openmp cmake-3.10.0 release-with-assert simd=avx2_256 hwloc libhwloc-2.0.4 gpuupdate
-# Test CUDA build on a agent with no CUDA devices
-# Test without TNG support
-# Test GPU update-constraints features in the above combination
+# Test GPU update-constraints features in a CUDA build without CUDA devices
gcc-7 gpuhw=none cuda-10.0 openmp no-tng release-with-assert gpuupdate
-# Test OpenCL build with gpudev features
# Test GPU update-constraints on the OpenCL path where it is unsupported
clang-8 openmp gpuhw=amd opencl-1.2 clFFT-2.14 simd=None gpuupdate
+
+# Test GPU update-constraints features with multiple PP ranks and one PME rank
+# Note: this should fall back correctly to the CPU codepath
+gcc-5 gpuhw=nvidia cuda-9.0 cmake-3.9.6 thread-mpi npme=1 nranks=3 release-with-assert gpuupdate
if (useGpuForUpdate)
{
- GMX_RELEASE_ASSERT(!DOMAINDECOMP(cr),
- "Domain decomposition is not supported with the GPU update.\n");
+ GMX_RELEASE_ASSERT(!DOMAINDECOMP(cr)
+ || (simulationWork.useGpuDirectCommunication
+ && simulationWork.useGpuPmePpCommunication),
+ "Domain decomposition is not supported with the GPU update when not "
+ "using direct GPU communication.\n");
GMX_RELEASE_ASSERT(useGpuForPme || (useGpuForNonbonded && simulationWork.useGpuBufferOps),
"Either PME or short-ranged non-bonded interaction tasks must run on "
"the GPU to use GPU update.\n");
try
{
useGpuForUpdate = decideWhetherToUseGpuForUpdate(
- useDomainDecomposition, useGpuForPme, useGpuForNonbonded, updateTarget,
+ useDomainDecomposition, useGpuForPme, useGpuForNonbonded,
+ devFlags.enableGpuPmePPComm, devFlags.enableGpuHaloExchange, updateTarget,
gpusWereDetected, *inputrec, mtop, doEssentialDynamics,
gmx_mtop_ftype_count(mtop, F_ORIRES) > 0, replExParams.exchangeInterval > 0);
}
bool decideWhetherToUseGpuForUpdate(const bool isDomainDecomposition,
const bool useGpuForPme,
const bool useGpuForNonbonded,
+ const bool gpuPmePpCommIsEnabled,
+ const bool gpuHaloExchangeIsEnabled,
const TaskTarget updateTarget,
const bool gpusWereDetected,
const t_inputrec& inputrec,
std::string errorMessage;
- if (isDomainDecomposition)
+ if (isDomainDecomposition && (!gpuPmePpCommIsEnabled || !gpuHaloExchangeIsEnabled))
{
- errorMessage += "Domain decomposition is not supported.\n";
+ errorMessage +=
+ "Domain decomposition is not supported without GPU halo exchange and GPU PME-PP "
+ "communication.\n";
}
// Using the GPU-version of update if:
// 1. PME is on the GPU (there should be a copy of coordinates on GPU for PME spread), or
* \param[in] isDomainDecomposition Whether there more than one domain.
* \param[in] useGpuForPme Whether GPUs will be used for PME interactions.
* \param[in] useGpuForNonbonded Whether GPUs will be used for nonbonded interactions.
+ * \param[in] gpuPmePpCommIsEnabled Whether GPU PME-PP communications are enabled in this run
+ * \param[in] gpuHaloExchangeIsEnabled Whether GPU halo exchange is enabled in this run
* \param[in] updateTarget User choice for running simulation on GPU.
* \param[in] gpusWereDetected Whether compatible GPUs were detected on any node.
* \param[in] inputrec The user input.
bool decideWhetherToUseGpuForUpdate(bool isDomainDecomposition,
bool useGpuForPme,
bool useGpuForNonbonded,
+ bool gpuPmePpCommIsEnabled,
+ bool gpuHaloExchangeIsEnabled,
TaskTarget updateTarget,
bool gpusWereDetected,
const t_inputrec& inputrec,