Remove two-stage initialization in DeviceStream
authorArtem Zhmurov <zhmurov@gmail.com>
Tue, 29 Sep 2020 14:08:18 +0000 (14:08 +0000)
committerPaul Bauer <paul.bauer.q@gmail.com>
Tue, 29 Sep 2020 14:08:18 +0000 (14:08 +0000)
A default constructor was needed for DeviceStream as an intermediate
measure to make the refactoring easier. It now can be eliminated.

src/gromacs/gpu_utils/device_stream.cpp
src/gromacs/gpu_utils/device_stream.cu
src/gromacs/gpu_utils/device_stream.h
src/gromacs/gpu_utils/device_stream_manager.cpp
src/gromacs/gpu_utils/device_stream_ocl.cpp
src/gromacs/gpu_utils/device_stream_sycl.cpp

index ecc8f09af06618bba7005aa1d049a4e8d0cc1d8b..6a90ffb4bb7ea2150d694216f8b70438b7e730b3 100644 (file)
 
 #include "device_stream.h"
 
-DeviceStream::DeviceStream() = default;
-
-void DeviceStream::init(const DeviceContext& /* deviceContext */,
-                        DeviceStreamPriority /* priority */,
-                        const bool /* useTiming */)
+DeviceStream::DeviceStream(const DeviceContext& /* deviceContext */,
+                           DeviceStreamPriority /* priority */,
+                           const bool /* useTiming */)
 {
 }
 
index 5cdc5bb20b37ce35e612ee263ceca0ed5e640fcf..0e07b00b2743661558aeb806d24e48ca2d58d17e 100644 (file)
 #include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/stringutil.h"
 
-DeviceStream::DeviceStream()
-{
-    stream_ = nullptr;
-}
-
-void DeviceStream::init(const DeviceContext& /* deviceContext */,
-                        DeviceStreamPriority priority,
-                        const bool /* useTiming */)
+DeviceStream::DeviceStream(const DeviceContext& /* deviceContext */,
+                           DeviceStreamPriority priority,
+                           const bool /* useTiming */)
 {
     cudaError_t stat;
 
index 5b74f590f29210d473f66dc2af91c3bc6145c92f..1a662db07d6d52ed73225d6e3b82c3c93d92cb21 100644 (file)
@@ -87,29 +87,16 @@ enum class DeviceStreamPriority : int
 class DeviceStream
 {
 public:
-    //! Default constructor
-    DeviceStream();
-    //! Destructor
-    ~DeviceStream();
-
-    /*! \brief Initialize
-     *
-     * \param[in] deviceContext  Device context (not used in CUDA).
-     * \param[in] priority       Stream priority: high or normal.
-     * \param[in] useTiming      If the timing should be enabled (not used in CUDA).
-     */
-    void init(const DeviceContext& deviceContext, DeviceStreamPriority priority, bool useTiming);
-
     /*! \brief Construct and init.
      *
      * \param[in] deviceContext  Device context (only used in OpenCL).
      * \param[in] priority       Stream priority: high or normal (only used in CUDA).
      * \param[in] useTiming      If the timing should be enabled (only used in OpenCL).
      */
-    DeviceStream(const DeviceContext& deviceContext, DeviceStreamPriority priority, const bool useTiming)
-    {
-        init(deviceContext, priority, useTiming);
-    }
+    DeviceStream(const DeviceContext& deviceContext, DeviceStreamPriority priority, bool useTiming);
+
+    //! Destructor
+    ~DeviceStream();
 
     /*! \brief Check if the underlying stream is valid.
      *
index 8b09713695ae9c3e24465a4d262164dfc43d28ed..c732156942e9601b99c3754b137fbe821b1ad0a7 100644 (file)
@@ -80,7 +80,7 @@ public:
     //! Device context.
     DeviceContext context_;
     //! GPU command streams.
-    EnumerationArray<DeviceStreamType, DeviceStream> streams_;
+    EnumerationArray<DeviceStreamType, std::unique_ptr<DeviceStream>> streams_;
 };
 
 // DeviceStreamManager::Impl
@@ -92,7 +92,8 @@ DeviceStreamManager::Impl::Impl(const DeviceInformation& deviceInfo,
 {
     try
     {
-        streams_[DeviceStreamType::NonBondedLocal].init(context_, DeviceStreamPriority::Normal, useTiming);
+        streams_[DeviceStreamType::NonBondedLocal] =
+                std::make_unique<DeviceStream>(context_, DeviceStreamPriority::Normal, useTiming);
 
         if (simulationWork.useGpuPme)
         {
@@ -100,23 +101,25 @@ DeviceStreamManager::Impl::Impl(const DeviceInformation& deviceInfo,
              * - default high priority with CUDA
              * - no priorities implemented yet with OpenCL; see #2532
              */
-            streams_[DeviceStreamType::Pme].init(context_, DeviceStreamPriority::High, useTiming);
+            streams_[DeviceStreamType::Pme] =
+                    std::make_unique<DeviceStream>(context_, DeviceStreamPriority::High, useTiming);
         }
 
         if (havePpDomainDecomposition)
         {
-            streams_[DeviceStreamType::NonBondedNonLocal].init(context_, DeviceStreamPriority::High,
-                                                               useTiming);
+            streams_[DeviceStreamType::NonBondedNonLocal] =
+                    std::make_unique<DeviceStream>(context_, DeviceStreamPriority::High, useTiming);
         }
         // Update stream is used both for coordinates transfers and for GPU update/constraints
         if (simulationWork.useGpuPme || simulationWork.useGpuUpdate || simulationWork.useGpuBufferOps)
         {
-            streams_[DeviceStreamType::UpdateAndConstraints].init(
-                    context_, DeviceStreamPriority::Normal, useTiming);
+            streams_[DeviceStreamType::UpdateAndConstraints] =
+                    std::make_unique<DeviceStream>(context_, DeviceStreamPriority::Normal, useTiming);
         }
         if (simulationWork.useGpuPmePpCommunication)
         {
-            streams_[DeviceStreamType::PmePpTransfer].init(context_, DeviceStreamPriority::Normal, useTiming);
+            streams_[DeviceStreamType::PmePpTransfer] =
+                    std::make_unique<DeviceStream>(context_, DeviceStreamPriority::Normal, useTiming);
         }
     }
     GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR
@@ -147,7 +150,7 @@ const DeviceContext& DeviceStreamManager::context() const
 
 const DeviceStream& DeviceStreamManager::stream(DeviceStreamType streamToGet) const
 {
-    return impl_->streams_[streamToGet];
+    return *impl_->streams_[streamToGet];
 }
 
 const DeviceStream& DeviceStreamManager::bondedStream(bool hasPPDomainDecomposition) const
@@ -170,7 +173,7 @@ const DeviceStream& DeviceStreamManager::bondedStream(bool hasPPDomainDecomposit
 
 bool DeviceStreamManager::streamIsValid(DeviceStreamType streamToCheck) const
 {
-    return impl_->streams_[streamToCheck].isValid();
+    return impl_->streams_[streamToCheck] != nullptr && impl_->streams_[streamToCheck]->isValid();
 }
 
 } // namespace gmx
index 63c93f6723a8089bf465dfc4e7dd7bf47539ab7d..914061627116a4387c274a63d852a6e78d10f35b 100644 (file)
 #include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/stringutil.h"
 
-DeviceStream::DeviceStream()
-{
-    stream_ = nullptr;
-}
-
-void DeviceStream::init(const DeviceContext& deviceContext, DeviceStreamPriority /* priority */, const bool useTiming)
+DeviceStream::DeviceStream(const DeviceContext& deviceContext,
+                           DeviceStreamPriority /* priority */,
+                           const bool useTiming)
 {
     const DeviceInformation&    deviceInfo      = deviceContext.deviceInfo();
     cl_command_queue_properties queueProperties = useTiming ? CL_QUEUE_PROFILING_ENABLE : 0;
index 275342ed92003acfcd9277e1ea5c24ccd4b34267..ecb76d87b96b94baa2d601ab09e75d9d567f376f 100644 (file)
 
 #include "gromacs/gpu_utils/device_stream.h"
 
-DeviceStream::DeviceStream() = default;
-
-void DeviceStream::init(const DeviceContext& /* deviceContext */,
-                        DeviceStreamPriority /* priority */,
-                        const bool /* useTiming */)
+DeviceStream::DeviceStream(const DeviceContext& /* deviceContext */,
+                           DeviceStreamPriority /* priority */,
+                           const bool /* useTiming */)
 {
 }