From 014c098e829e7dee94e9e0fae31940bfe8ea8321 Mon Sep 17 00:00:00 2001 From: Roland Schulz Date: Sat, 1 Sep 2018 23:49:51 -0700 Subject: [PATCH] Reduce duplication in gpu_utils Change-Id: I6307e56aa570bd3ff04926879f212aa7f9bf5967 --- src/gromacs/gpu_utils/CMakeLists.txt | 5 +-- src/gromacs/gpu_utils/gpu_utils.cpp | 42 +++++++++++++++++++---- src/gromacs/gpu_utils/gpu_utils.cu | 39 +++------------------- src/gromacs/gpu_utils/gpu_utils.h | 14 ++++---- src/gromacs/gpu_utils/gpu_utils_ocl.cpp | 44 ++++--------------------- 5 files changed, 54 insertions(+), 90 deletions(-) diff --git a/src/gromacs/gpu_utils/CMakeLists.txt b/src/gromacs/gpu_utils/CMakeLists.txt index 030cf59dcd..6f2c5bc412 100644 --- a/src/gromacs/gpu_utils/CMakeLists.txt +++ b/src/gromacs/gpu_utils/CMakeLists.txt @@ -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) diff --git a/src/gromacs/gpu_utils/gpu_utils.cpp b/src/gromacs/gpu_utils/gpu_utils.cpp index 07d2ad4de0..753c5d8848 100644 --- a/src/gromacs/gpu_utils/gpu_utils.cpp +++ b/src/gromacs/gpu_utils/gpu_utils.cpp @@ -41,8 +41,14 @@ #include "gpu_utils.h" +#include "config.h" + +#include + #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 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(gpu_info->gpu_dev)); //circumvent is_pod check in sfree +} + +std::vector getCompatibleGpus(const gmx_gpu_info_t &gpu_info) { - // There can't be any compatible GPUs - return std::vector(); + // Possible minor over-allocation here, but not important for anything + std::vector 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)]); } diff --git a/src/gromacs/gpu_utils/gpu_utils.cu b/src/gromacs/gpu_utils/gpu_utils.cu index d464bde726..107d90fb31 100644 --- a/src/gromacs/gpu_utils/gpu_utils.cu +++ b/src/gromacs/gpu_utils/gpu_utils.cu @@ -772,40 +772,6 @@ void findGpus(gmx_gpu_info_t *gpu_info) gpu_info->gpu_dev = devs; } -std::vector getCompatibleGpus(const gmx_gpu_info_t &gpu_info) -{ - // Possible minor over-allocation here, but not important for anything - std::vector 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; +} diff --git a/src/gromacs/gpu_utils/gpu_utils.h b/src/gromacs/gpu_utils/gpu_utils.h index 01dcec9203..6ee8b09a9d 100644 --- a/src/gromacs/gpu_utils/gpu_utils.h +++ b/src/gromacs/gpu_utils/gpu_utils.h @@ -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 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. * diff --git a/src/gromacs/gpu_utils/gpu_utils_ocl.cpp b/src/gromacs/gpu_utils/gpu_utils_ocl.cpp index 0e9769e4fe..c541eb06e7 100644 --- a/src/gromacs/gpu_utils/gpu_utils_ocl.cpp +++ b/src/gromacs/gpu_utils/gpu_utils_ocl.cpp @@ -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 getCompatibleGpus(const gmx_gpu_info_t &gpu_info) -{ - // Possible minor over-allocation here, but not important for anything - std::vector 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; +} -- 2.22.0