SYCL: Allow copying an uninitialized DeviceBuffer object
authorAndrey Alekseenko <al42and@gmail.com>
Sun, 9 May 2021 12:48:12 +0000 (15:48 +0300)
committerArtem Zhmurov <zhmurov@gmail.com>
Mon, 10 May 2021 09:30:06 +0000 (09:30 +0000)
Needed for sharing more code between CUDA and SYCL.

Refs #4045, related to #3020

src/gromacs/gpu_utils/devicebuffer_sycl.h

index 68d245337fb6d643865850680f4d455aab6ba527..48a4ddc55d6951676a1d8b6092d28215eec8cd77 100644 (file)
@@ -81,9 +81,16 @@ DeviceBuffer<T>::~DeviceBuffer() = default;
 
 //! Copy constructor (references the same underlying SYCL buffer).
 template<typename T>
-DeviceBuffer<T>::DeviceBuffer(DeviceBuffer<T> const& src) :
-    buffer_(new ClSyclBufferWrapper(*src.buffer_))
+DeviceBuffer<T>::DeviceBuffer(DeviceBuffer<T> const& src)
 {
+    if (src.buffer_)
+    {
+        buffer_ = std::make_unique<ClSyclBufferWrapper>(*src.buffer_);
+    }
+    else
+    {
+        buffer_ = nullptr;
+    }
 }
 
 //! Move constructor.
@@ -94,7 +101,14 @@ DeviceBuffer<T>::DeviceBuffer(DeviceBuffer<T>&& src) noexcept = default;
 template<typename T>
 DeviceBuffer<T>& DeviceBuffer<T>::operator=(DeviceBuffer<T> const& src)
 {
-    buffer_.reset(new ClSyclBufferWrapper(*src.buffer_));
+    if (src.buffer_)
+    {
+        buffer_ = std::make_unique<ClSyclBufferWrapper>(*src.buffer_);
+    }
+    else
+    {
+        buffer_.reset(nullptr);
+    }
     return *this;
 }