int *kernel_type,
int *ewald_excl)
{
- gmx_bool bEmulateGPU, bGPU;
+ gmx_bool bEmulateGPU, bGPU, bEmulateGPUEnvVarSet;
char gpu_err_str[STRLEN];
assert(kernel_type);
*kernel_type = nbkNotSet;
*ewald_excl = ewaldexclTable;
- /* if bUseGPU == NULL we don't want a GPU (e.g. hybrid mode kernel selection) */
- bGPU = (bUseGPU != NULL) && hwinfo->bCanUseGPU;
- /* Run GPU emulation mode if GMX_EMULATE_GPU is defined or in case if nobonded
- calculations are turned off via GMX_NO_NONBONDED -- this is the simple way
- to turn off GPU/CUDA initializations as well.. */
- bEmulateGPU = ((getenv("GMX_EMULATE_GPU") != NULL) ||
- (getenv("GMX_NO_NONBONDED") != NULL));
+ bEmulateGPUEnvVarSet = (getenv("GMX_EMULATE_GPU") != NULL);
- if (bGPU)
+ /* if bUseGPU == NULL we don't want a GPU (e.g. hybrid mode kernel selection) */
+ bGPU = ((bUseGPU != NULL) && hwinfo->bCanUseGPU);
+
+ /* Run GPU emulation mode if GMX_EMULATE_GPU is defined. We will
+ * automatically switch to emulation if non-bonded calculations are
+ * turned off via GMX_NO_NONBONDED - this is the simple and elegant
+ * way to turn off GPU initialization, data movement, and cleanup. */
+ bEmulateGPU = (bEmulateGPUEnvVarSet || (getenv("GMX_NO_NONBONDED") != NULL && bGPU));
+
+ /* Enable GPU mode when GPUs are available or GPU emulation is requested.
+ * The latter is useful to assess the performance one can expect by adding
+ * GPU(s) to the machine. The conditional below allows this even if mdrun
+ * is compiled without GPU acceleration support.
+ * Note that such a GPU acceleration performance assessment should be
+ * carried out by setting the GMX_EMULATE_GPU and GMX_NO_NONBONDED env. vars
+ * (and freezing the system as otherwise it would explode). */
+ if (bGPU || bEmulateGPUEnvVarSet)
{
if (bEmulateGPU)
{
else
{
/* Each PP node will use the intra-node id-th device from the
- * list of detected/selected GPUs. */
+ * list of detected/selected GPUs. */
if (!init_gpu(cr->nodeid_group_intra, gpu_err_str, &hwinfo->gpu_info))
{
- /* At this point the init should never fail as we made sure that
+ /* At this point the init should never fail as we made sure that
* we have all the GPUs we need. If it still does, we'll bail. */
gmx_fatal(FARGS, "On node %d failed to initialize GPU #%d: %s",
cr->nodeid,