From 26bb9126466be72504e4710f6530e2d43112d5fb Mon Sep 17 00:00:00 2001 From: Tom Deakin Date: Tue, 3 May 2016 11:23:36 +0100 Subject: [PATCH] Check OCL device has enough memory for buffers --- src/OCLStream.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/OCLStream.cpp b/src/OCLStream.cpp index ed419b5..e962ea5 100644 --- a/src/OCLStream.cpp +++ b/src/OCLStream.cpp @@ -53,8 +53,6 @@ OCLStream::OCLStream(const unsigned int ARRAY_SIZE, const int device_index) if (!cached) getDeviceList(); - array_size = ARRAY_SIZE; - // Setup default OpenCL GPU if (device_index >= devices.size()) throw std::runtime_error("Invalid device index"); @@ -85,6 +83,16 @@ OCLStream::OCLStream(const unsigned int ARRAY_SIZE, const int device_index) add_kernel = new cl::KernelFunctor(program, "add"); triad_kernel = new cl::KernelFunctor(program, "triad"); + array_size = ARRAY_SIZE; + + // Check buffers fit on the device + cl_ulong totalmem = device.getInfo(); + cl_ulong maxbuffer = device.getInfo(); + if (maxbuffer < sizeof(T)*ARRAY_SIZE) + throw std::runtime_error("Device cannot allocate a buffer big enough"); + if (totalmem < 3*sizeof(T)*ARRAY_SIZE) + throw std::runtime_error("Device does not have enough memory for all 3 buffers"); + // Create buffers d_a = cl::Buffer(context, CL_MEM_READ_WRITE, sizeof(T) * ARRAY_SIZE); d_b = cl::Buffer(context, CL_MEM_READ_WRITE, sizeof(T) * ARRAY_SIZE);