From 01aa90071870cbb82e22b8756ca6c1015821f1a7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Szil=C3=A1rd=20P=C3=A1ll?= Date: Fri, 21 May 2021 10:16:51 +0000 Subject: [PATCH] Workaround for a hipSYCL assertion error --- src/gromacs/gpu_utils/devicebuffer_sycl.h | 36 +++++++++++++++++++---- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/gromacs/gpu_utils/devicebuffer_sycl.h b/src/gromacs/gpu_utils/devicebuffer_sycl.h index 48a4ddc55d..3ae9b615da 100644 --- a/src/gromacs/gpu_utils/devicebuffer_sycl.h +++ b/src/gromacs/gpu_utils/devicebuffer_sycl.h @@ -404,7 +404,7 @@ namespace gmx::internal { /*! \brief Helper function to clear device buffer. * - * Not applicable to GROMACS's float3 (a.k.a. gmx::RVec) and other custom types. + * Not applicable to GROMACS's Float3 (a.k.a. gmx::RVec) and other custom types. * From SYCL specs: "T must be a scalar value or a SYCL vector type." */ template @@ -425,17 +425,43 @@ cl::sycl::event fillSyclBufferWithNull(cl::sycl::buffer& buffer, }); } -//! \brief Helper function to clear device buffer of type float3. +//! \brief Helper function to clear device buffer of type Float3. template<> inline cl::sycl::event fillSyclBufferWithNull(cl::sycl::buffer& buffer, size_t startingOffset, size_t numValues, cl::sycl::queue queue) { - cl::sycl::buffer bufferAsFloat = buffer.reinterpret(buffer.get_count() * DIM); - return fillSyclBufferWithNull( - bufferAsFloat, startingOffset * DIM, numValues * DIM, std::move(queue)); + constexpr bool usingHipSycl = +#ifdef __HIPSYCL__ + true; +#else + false; +#endif + + + if constexpr (usingHipSycl) + { + // hipSYCL does not support reinterpret but allows using Float3 directly. + using cl::sycl::access::mode; + const cl::sycl::range<1> range(numValues); + const cl::sycl::id<1> offset(startingOffset); + const Float3 pattern{ 0, 0, 0 }; + + return queue.submit([&](cl::sycl::handler& cgh) { + auto d_bufferAccessor = + cl::sycl::accessor{ buffer, cgh, range, offset }; + cgh.fill(d_bufferAccessor, pattern); + }); + } + else // When not using hipSYCL, reinterpret as a flat float array + { + cl::sycl::buffer bufferAsFloat = buffer.reinterpret(buffer.get_count() * DIM); + return fillSyclBufferWithNull( + bufferAsFloat, startingOffset * DIM, numValues * DIM, std::move(queue)); + } } + } // namespace gmx::internal /*! \brief -- 2.22.0