From fd0c311db88c8dfe944c4ebc6c46c13e08f34f82 Mon Sep 17 00:00:00 2001 From: Andrey Alekseenko Date: Wed, 23 Sep 2020 18:34:29 +0200 Subject: [PATCH] Fix false-positives in checkDeviceBuffer for OpenCL The function takes required number of elements as its argument, but then compares it with the buffer size measured in bytes. --- src/gromacs/gpu_utils/devicebuffer_ocl.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/gromacs/gpu_utils/devicebuffer_ocl.h b/src/gromacs/gpu_utils/devicebuffer_ocl.h index 86ccd4ae6b..227370968f 100644 --- a/src/gromacs/gpu_utils/devicebuffer_ocl.h +++ b/src/gromacs/gpu_utils/devicebuffer_ocl.h @@ -268,13 +268,14 @@ void clearDeviceBufferAsync(DeviceBuffer* buffer, template static bool checkDeviceBuffer(DeviceBuffer buffer, int requiredSize) { - size_t size; - int retval = clGetMemObjectInfo(buffer, CL_MEM_SIZE, sizeof(size), &size, nullptr); + const size_t requiredSizeBytes = requiredSize * sizeof(T); + size_t sizeBytes; + cl_int retval = clGetMemObjectInfo(buffer, CL_MEM_SIZE, sizeof(sizeBytes), &sizeBytes, nullptr); GMX_ASSERT(retval == CL_SUCCESS, gmx::formatString("clGetMemObjectInfo failed with error code #%d", retval).c_str()); - GMX_ASSERT(static_cast(size) >= requiredSize, + GMX_ASSERT(sizeBytes >= requiredSizeBytes, "Number of atoms in device buffer is smaller then required size."); - return retval == CL_SUCCESS && static_cast(size) >= requiredSize; + return retval == CL_SUCCESS && sizeBytes >= requiredSizeBytes; } //! Device texture wrapper. -- 2.11.4.GIT