Fix false-positives in checkDeviceBuffer for OpenCL
authorAndrey Alekseenko <al42and@gmail.com>
Wed, 23 Sep 2020 16:34:29 +0000 (18:34 +0200)
committerMark Abraham <mark.j.abraham@gmail.com>
Wed, 23 Sep 2020 18:23:54 +0000 (18:23 +0000)
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

index 86ccd4ae6bd46c81217cd2e80b1fc4e62fca4885..227370968f5dcf97fa98f4debe75efe5a70d4dd7 100644 (file)
@@ -268,13 +268,14 @@ void clearDeviceBufferAsync(DeviceBuffer<ValueType>* buffer,
 template<typename T>
 static bool checkDeviceBuffer(DeviceBuffer<T> 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<int>(size) >= requiredSize,
+    GMX_ASSERT(sizeBytes >= requiredSizeBytes,
                "Number of atoms in device buffer is smaller then required size.");
-    return retval == CL_SUCCESS && static_cast<int>(size) >= requiredSize;
+    return retval == CL_SUCCESS && sizeBytes >= requiredSizeBytes;
 }
 
 //! Device texture wrapper.