#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2015,2016,2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
clfftinitializer.cpp
hostallocator.cpp
gpu_utils.cpp
+ gpu_testutils.cpp
)
if(GMX_USE_OPENCL)
gmx_add_libgromacs_sources(
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief Function definitions for GPU detection, specific for tests.
+ *
+ * \author Artem Zhmurov <zhmurov@gmail.com>
+ */
+#include "gmxpre.h"
+
+#include "gpu_testutils.h"
+
+#include "gromacs/gpu_utils/gpu_utils.h"
+#include "gromacs/hardware/gpu_hw_info.h"
+
+bool canComputeOnGpu()
+{
+ bool canComputeOnGpu = false;
+ gmx_gpu_info_t gpuInfo {};
+ if (canPerformGpuDetection())
+ {
+ findGpus(&gpuInfo);
+ canComputeOnGpu = !getCompatibleGpus(gpuInfo).empty();
+ }
+ free_gpu_info(&gpuInfo);
+ return canComputeOnGpu;
+}
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \libinternal \file
+ * \brief Declare functions for detection of GPU devices, specific for tests.
+ *
+ * \todo This should eventually go to src/testutils
+ *
+ * \author Artem Zhmurov <zhmurov@gmail.com>
+ *
+ * \inlibraryapi
+ */
+
+#ifndef GMX_GPU_UTILS_GPU_TESTUTILS_H
+#define GMX_GPU_UTILS_GPU_TESTUTILS_H
+
+/*! \brief Checks if there is a compatible GPU to run the computations on
+ *
+ * There are several reasons why code can not rune on the GPU:
+ * 1. The GPU can not be detected, because there is none in the system.
+ * 2. GPU detection is disabled by GMX_DISABLE_GPU_DETECTION environmental variable.
+ * 3. GPUs are detected, but none of them is compatible.
+ * This function checks all these conditions and returns true only if there at least
+ * one GPU that can be used for computations.
+ *
+ * \returns True, if there a GPU that can be used for computations
+ */
+bool canComputeOnGpu();
+
+#endif // GMX_GPU_UTILS_GPU_TESTUTILS_H
{
algorithmsNames.emplace_back("SHAKE");
algorithmsNames.emplace_back("LINCS");
- // TODO: Here we should check that at least 1 suitable GPU is available
- if (GMX_GPU == GMX_GPU_CUDA && canPerformGpuDetection())
+ if (GMX_GPU == GMX_GPU_CUDA && canComputeOnGpu())
{
algorithmsNames.emplace_back("LINCS_CUDA");
}
#include "gromacs/fileio/gmxfio.h"
#include "gromacs/gmxlib/nrnb.h"
#include "gromacs/gmxlib/nonbonded/nonbonded.h"
-#include "gromacs/gpu_utils/gpu_utils.h"
+#include "gromacs/gpu_utils/gpu_testutils.h"
#include "gromacs/math/paddedvector.h"
#include "gromacs/math/vec.h"
#include "gromacs/math/vectypes.h"
#include <gtest/gtest.h>
-#include "gromacs/gpu_utils/gpu_utils.h"
+#include "gromacs/gpu_utils/gpu_testutils.h"
#include "gromacs/math/vec.h"
#include "gromacs/mdlib/leapfrog_cuda.h"
#include "gromacs/utility/stringutil.h"
mdAtoms_.invmass = inverseMasses_.data();
}
+ //! Store whether any compatible GPUs exist.
+ static bool s_hasCompatibleGpus;
+ //! Before any test is run, work out whether any compatible GPUs exist.
+ static void SetUpTestCase()
+ {
+ s_hasCompatibleGpus = canComputeOnGpu();
+ }
};
+bool IntegratorTest::s_hasCompatibleGpus = false;
+
+// The test will run only if:
+// 1. The code was compiled with CUDA
+// 2. There is a CUDA-capable GPU in a system
+// 3. This GPU is detectable
+// 4. GPU detection was not disabled by GMX_DISABLE_GPU_DETECTION environment variable
TEST_P(IntegratorTest, SimpleIntegration)
{
- // TODO: Here we should check that at least 1 suitable GPU is available
- if (!canPerformGpuDetection())
+ if (!s_hasCompatibleGpus)
{
return;
}
+
int numAtoms; // 1. Number of atoms
real timestep; // 2. Timestep
rvec v0; // 3. Velocity
#include <gtest/gtest.h>
-#include "gromacs/gpu_utils/gpu_utils.h"
+#include "gromacs/gpu_utils/gpu_testutils.h"
#include "gromacs/math/paddedvector.h"
#include "gromacs/math/vec.h"
#include "gromacs/math/vectypes.h"
velocities_[i / DIM][i % DIM] = 0.0;
}
}
+
+ //! Store whether any compatible GPUs exist.
+ static bool s_hasCompatibleGpus;
+ //! Before any test is run, work out whether any compatible GPUs exist.
+ static void SetUpTestCase()
+ {
+ s_hasCompatibleGpus = canComputeOnGpu();
+ }
};
+bool SettleTest::s_hasCompatibleGpus = false;
+
TEST_P(SettleTest, SatisfiesConstraints)
{
int numSettles;
}
}
- // CUDA version will be tested only if
- // 1. The code was compiled with cuda
+ // CUDA version will be tested only if:
+ // 1. The code was compiled with CUDA
// 2. There is a CUDA-capable GPU in a system
+ // 3. This GPU is detectable
+ // 4. GPU detection was not disabled by GMX_DISABLE_GPU_DETECTION environment variable
#if GMX_GPU == GMX_GPU_CUDA
- // TODO: Here we should check that at least 1 suitable GPU is available
- if (canPerformGpuDetection())
+ if (s_hasCompatibleGpus)
{
// Run the CUDA code and check if it gives identical results to CPU code
t_idef idef;
#include <gtest/gtest-spi.h>
#include "gromacs/ewald/pme.h"
-#include "gromacs/gpu_utils/gpu_utils.h"
+#include "gromacs/gpu_utils/gpu_testutils.h"
#include "gromacs/hardware/detecthardware.h"
#include "gromacs/hardware/gpu_hw_info.h"
#include "gromacs/trajectory/energyframe.h"
void PmeTest::SetUpTestCase()
{
- gmx_gpu_info_t gpuInfo {};
- // It would be nicer to do this detection once and have mdrun
- // re-use it, but this is OK. Note that this also caters for when
- // there is no GPU support in the build.
- //
- // TODO report any error messages gracefully.
- if (canPerformGpuDetection())
- {
- findGpus(&gpuInfo);
- s_hasCompatibleGpus = (gpuInfo.n_dev_compatible > 0);
- }
- free_gpu_info(&gpuInfo);
+ s_hasCompatibleGpus = canComputeOnGpu();
}
void PmeTest::runTest(const RunModesList &runModes)