From: Artem Zhmurov Date: Tue, 29 Sep 2020 14:08:18 +0000 (+0000) Subject: Remove two-stage initialization in DeviceStream X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=commitdiff_plain;h=c278064b3ed97c8e12da584cb3faddc8f667572b;p=alexxy%2Fgromacs.git Remove two-stage initialization in DeviceStream A default constructor was needed for DeviceStream as an intermediate measure to make the refactoring easier. It now can be eliminated. --- diff --git a/src/gromacs/gpu_utils/device_stream.cpp b/src/gromacs/gpu_utils/device_stream.cpp index ecc8f09af0..6a90ffb4bb 100644 --- a/src/gromacs/gpu_utils/device_stream.cpp +++ b/src/gromacs/gpu_utils/device_stream.cpp @@ -44,11 +44,9 @@ #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 */) { } diff --git a/src/gromacs/gpu_utils/device_stream.cu b/src/gromacs/gpu_utils/device_stream.cu index 5cdc5bb20b..0e07b00b27 100644 --- a/src/gromacs/gpu_utils/device_stream.cu +++ b/src/gromacs/gpu_utils/device_stream.cu @@ -48,14 +48,9 @@ #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; diff --git a/src/gromacs/gpu_utils/device_stream.h b/src/gromacs/gpu_utils/device_stream.h index 5b74f590f2..1a662db07d 100644 --- a/src/gromacs/gpu_utils/device_stream.h +++ b/src/gromacs/gpu_utils/device_stream.h @@ -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. * diff --git a/src/gromacs/gpu_utils/device_stream_manager.cpp b/src/gromacs/gpu_utils/device_stream_manager.cpp index 8b09713695..c732156942 100644 --- a/src/gromacs/gpu_utils/device_stream_manager.cpp +++ b/src/gromacs/gpu_utils/device_stream_manager.cpp @@ -80,7 +80,7 @@ public: //! Device context. DeviceContext context_; //! GPU command streams. - EnumerationArray streams_; + EnumerationArray> 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(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(context_, DeviceStreamPriority::High, useTiming); } if (havePpDomainDecomposition) { - streams_[DeviceStreamType::NonBondedNonLocal].init(context_, DeviceStreamPriority::High, - useTiming); + streams_[DeviceStreamType::NonBondedNonLocal] = + std::make_unique(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(context_, DeviceStreamPriority::Normal, useTiming); } if (simulationWork.useGpuPmePpCommunication) { - streams_[DeviceStreamType::PmePpTransfer].init(context_, DeviceStreamPriority::Normal, useTiming); + streams_[DeviceStreamType::PmePpTransfer] = + std::make_unique(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 diff --git a/src/gromacs/gpu_utils/device_stream_ocl.cpp b/src/gromacs/gpu_utils/device_stream_ocl.cpp index 63c93f6723..9140616271 100644 --- a/src/gromacs/gpu_utils/device_stream_ocl.cpp +++ b/src/gromacs/gpu_utils/device_stream_ocl.cpp @@ -50,12 +50,9 @@ #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; diff --git a/src/gromacs/gpu_utils/device_stream_sycl.cpp b/src/gromacs/gpu_utils/device_stream_sycl.cpp index 275342ed92..ecb76d87b9 100644 --- a/src/gromacs/gpu_utils/device_stream_sycl.cpp +++ b/src/gromacs/gpu_utils/device_stream_sycl.cpp @@ -44,11 +44,9 @@ #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 */) { }