Reduce duplication in gpu_utils
authorRoland Schulz <roland.schulz@intel.com>
Sun, 2 Sep 2018 06:49:51 +0000 (23:49 -0700)
committerPaul Bauer <paul.bauer.q@gmail.com>
Mon, 3 Sep 2018 07:52:34 +0000 (09:52 +0200)
Change-Id: I6307e56aa570bd3ff04926879f212aa7f9bf5967

src/gromacs/gpu_utils/CMakeLists.txt
src/gromacs/gpu_utils/gpu_utils.cpp
src/gromacs/gpu_utils/gpu_utils.cu
src/gromacs/gpu_utils/gpu_utils.h
src/gromacs/gpu_utils/gpu_utils_ocl.cpp

index 030cf59dcde890d38b397e322868f2ee7d7f0517..6f2c5bc412cd5ef6cdd3a85157e14d85521833b2 100644 (file)
@@ -39,6 +39,7 @@
 gmx_add_libgromacs_sources(
         clfftinitializer.cpp
         hostallocator.cpp
+        gpu_utils.cpp
         )
 if(GMX_USE_OPENCL)
     gmx_add_libgromacs_sources(
@@ -54,10 +55,6 @@ elseif(GMX_USE_CUDA)
         pinning.cu
         pmalloc_cuda.cu
         )
-else()
-    gmx_add_libgromacs_sources(
-        gpu_utils.cpp
-        )
 endif()
 
 if(GMX_USE_OPENCL)
index 07d2ad4de0cba95d0cc0648b12fcf55918da452a..753c5d88484c8d3fe15e184db592688d8d4683d3 100644 (file)
 
 #include "gpu_utils.h"
 
+#include "config.h"
+
+#include <cassert>
+
 #include "gromacs/hardware/gpu_hw_info.h"
+#include "gromacs/utility/smalloc.h"
 
+#if !GMX_GPU
 /*! \brief Set allocation functions used by the GPU host
  *
  * Since GPU support is not configured, there is no host memory to
@@ -55,15 +61,37 @@ void gpu_set_host_malloc_and_free(bool /*unused*/,
     *nb_free  = nullptr;
 }
 
-//! This function is documented in the header file
-std::vector<int> getCompatibleGpus(const gmx_gpu_info_t & /*gpu_info*/)
+int gpu_info_get_stat(const gmx_gpu_info_t & /*unused*/, int /*unused*/)
+{
+    return egpuNonexistent;
+}
+#endif
+
+void free_gpu_info(const gmx_gpu_info_t *gpu_info)
+{
+    sfree(static_cast<void*>(gpu_info->gpu_dev)); //circumvent is_pod check in sfree
+}
+
+std::vector<int> getCompatibleGpus(const gmx_gpu_info_t &gpu_info)
 {
-    // There can't be any compatible GPUs
-    return std::vector<int>();
+    // Possible minor over-allocation here, but not important for anything
+    std::vector<int> compatibleGpus;
+    compatibleGpus.reserve(gpu_info.n_dev);
+    for (int i = 0; i < gpu_info.n_dev; i++)
+    {
+        assert(gpu_info.gpu_dev);
+        if (gpu_info_get_stat(gpu_info, i) == egpuCompatible)
+        {
+            compatibleGpus.push_back(i);
+        }
+    }
+    return compatibleGpus;
 }
 
-const char *getGpuCompatibilityDescription(const gmx_gpu_info_t & /*gpu_info*/,
-                                           int                    /*index*/)
+const char *getGpuCompatibilityDescription(const gmx_gpu_info_t &gpu_info,
+                                           int                   index)
 {
-    return gpu_detect_res_str[egpuNonexistent];
+    return (index >= gpu_info.n_dev ?
+            gpu_detect_res_str[egpuNonexistent] :
+            gpu_detect_res_str[gpu_info_get_stat(gpu_info, index)]);
 }
index d464bde726acd56cad8d1d9a12041fe268c21c7a..107d90fb31830b04679a55ffbad9718f7fd7b928 100644 (file)
@@ -772,40 +772,6 @@ void findGpus(gmx_gpu_info_t *gpu_info)
     gpu_info->gpu_dev = devs;
 }
 
-std::vector<int> getCompatibleGpus(const gmx_gpu_info_t &gpu_info)
-{
-    // Possible minor over-allocation here, but not important for anything
-    std::vector<int> compatibleGpus;
-    compatibleGpus.reserve(gpu_info.n_dev);
-    for (int i = 0; i < gpu_info.n_dev; i++)
-    {
-        assert(gpu_info.gpu_dev);
-        if (gpu_info.gpu_dev[i].stat == egpuCompatible)
-        {
-            compatibleGpus.push_back(i);
-        }
-    }
-    return compatibleGpus;
-}
-
-const char *getGpuCompatibilityDescription(const gmx_gpu_info_t &gpu_info,
-                                           int                   index)
-{
-    return (index >= gpu_info.n_dev ?
-            gpu_detect_res_str[egpuNonexistent] :
-            gpu_detect_res_str[gpu_info.gpu_dev[index].stat]);
-}
-
-void free_gpu_info(const gmx_gpu_info_t *gpu_info)
-{
-    if (gpu_info == NULL)
-    {
-        return;
-    }
-
-    sfree(gpu_info->gpu_dev);
-}
-
 void get_gpu_device_info_string(char *s, const gmx_gpu_info_t &gpu_info, int index)
 {
     assert(s);
@@ -908,3 +874,8 @@ void resetGpuProfiler(void)
         startGpuProfiler();
     }
 }
+
+int gpu_info_get_stat(const gmx_gpu_info_t &info, int index)
+{
+    return info.gpu_dev[index].stat;
+}
index 01dcec9203a476eb05601ded924fb80400d563f5..6ee8b09a9dd667d5bcec0dfd61cf9b40fa675425 100644 (file)
@@ -112,7 +112,7 @@ bool canDetectGpus(std::string *GPU_FUNC_ARGUMENT(errorMessage)) GPU_FUNC_TERM_W
  *                         the call to canDetectGpus() should always prevent this occuring)
  */
 GPU_FUNC_QUALIFIER
-void findGpus(struct gmx_gpu_info_t *GPU_FUNC_ARGUMENT(gpu_info)) GPU_FUNC_TERM
+void findGpus(gmx_gpu_info_t *GPU_FUNC_ARGUMENT(gpu_info)) GPU_FUNC_TERM
 
 /*! \brief Return a container of the detected GPUs that are compatible.
  *
@@ -129,15 +129,14 @@ std::vector<int> getCompatibleGpus(const gmx_gpu_info_t &gpu_info);
  * \param[in]   index       index of GPU to ask about
  * \returns                 A null-terminated C string describing the compatibility status, useful for error messages.
  */
-const char *getGpuCompatibilityDescription(const gmx_gpu_info_t &GPU_FUNC_ARGUMENT(gpu_info),
-                                           int GPU_FUNC_ARGUMENT(index));
+const char *getGpuCompatibilityDescription(const gmx_gpu_info_t &gpu_info,
+                                           int                   index);
 
 /*! \brief Frees the gpu_dev and dev_use array fields of \p gpu_info.
  *
  * \param[in]    gpu_info    pointer to structure holding GPU information
  */
-GPU_FUNC_QUALIFIER
-void free_gpu_info(const struct gmx_gpu_info_t *GPU_FUNC_ARGUMENT(gpu_info)) GPU_FUNC_TERM
+void free_gpu_info(const gmx_gpu_info_t *gpu_info);
 
 /*! \brief Initializes the GPU described by \c deviceInfo.
  *
@@ -204,7 +203,7 @@ int get_current_cuda_gpu_device_id(void) CUDA_FUNC_TERM_WITH_RETURN(-1)
  */
 GPU_FUNC_QUALIFIER
 void get_gpu_device_info_string(char *GPU_FUNC_ARGUMENT(s),
-                                const struct gmx_gpu_info_t &GPU_FUNC_ARGUMENT(gpu_info),
+                                const gmx_gpu_info_t &GPU_FUNC_ARGUMENT(gpu_info),
                                 int GPU_FUNC_ARGUMENT(index)) GPU_FUNC_TERM
 
 /*! \brief Returns the size of the gpu_dev_info struct.
@@ -235,7 +234,8 @@ void gpu_set_host_malloc_and_free(bool               bUseGpuKernels,
                                   gmx_host_alloc_t **nb_alloc,
                                   gmx_host_free_t  **nb_free);
 
-
+//! Get status of device with specified index
+int gpu_info_get_stat(const gmx_gpu_info_t &info, int index);
 
 /*! \brief Starts the GPU profiler if mdrun is being profiled.
  *
index 0e9769e4fec0b1a7497592e113042899481b4f7b..c541eb06e72d5c907858cbb7c59566f100760248 100644 (file)
@@ -100,7 +100,7 @@ runningOnCompatibleOSForAmd()
  * \returns             true if the GPU properties passed indicate a compatible
  *                      GPU, otherwise false.
  */
-static int is_gmx_supported_gpu_id(struct gmx_device_info_t *ocl_gpu_device)
+static int is_gmx_supported_gpu_id(gmx_device_info_t *ocl_gpu_device)
 {
     if ((getenv("GMX_OCL_DISABLE_COMPATIBILITY_CHECK")) != nullptr)
     {
@@ -346,43 +346,6 @@ void findGpus(gmx_gpu_info_t *gpu_info)
     sfree(ocl_platform_ids);
 }
 
-//! This function is documented in the header file
-void free_gpu_info(const gmx_gpu_info_t gmx_unused *gpu_info)
-{
-    if (gpu_info == nullptr)
-    {
-        return;
-    }
-
-    sfree(gpu_info->gpu_dev);
-}
-
-//! This function is documented in the header file
-std::vector<int> getCompatibleGpus(const gmx_gpu_info_t &gpu_info)
-{
-    // Possible minor over-allocation here, but not important for anything
-    std::vector<int> compatibleGpus;
-    compatibleGpus.reserve(gpu_info.n_dev);
-    for (int i = 0; i < gpu_info.n_dev; i++)
-    {
-        assert(gpu_info.gpu_dev);
-        if (gpu_info.gpu_dev[i].stat == egpuCompatible)
-        {
-            compatibleGpus.push_back(i);
-        }
-    }
-    return compatibleGpus;
-}
-
-//! This function is documented in the header file
-const char *getGpuCompatibilityDescription(const gmx_gpu_info_t &gpu_info,
-                                           int                   index)
-{
-    return (index >= gpu_info.n_dev ?
-            gpu_detect_res_str[egpuNonexistent] :
-            gpu_detect_res_str[gpu_info.gpu_dev[index].stat]);
-}
-
 //! This function is documented in the header file
 void get_gpu_device_info_string(char *s, const gmx_gpu_info_t &gpu_info, int index)
 {
@@ -470,3 +433,8 @@ void gpu_set_host_malloc_and_free(bool               bUseGpuKernels,
         *nb_free  = nullptr;
     }
 }
+
+int gpu_info_get_stat(const gmx_gpu_info_t &info, int index)
+{
+    return info.gpu_dev[index].stat;
+}