|
@@ -195,6 +195,20 @@ cl_int starpu_opencl_allocate_memory(cl_mem *mem, size_t size, cl_mem_flags flag
|
|
|
if (err == CL_OUT_OF_HOST_MEMORY) return err;
|
|
|
if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err);
|
|
|
|
|
|
+ /*
|
|
|
+ * OpenCL uses lazy memory allocation: we will only know if the
|
|
|
+ * allocation failed when trying to copy data onto the device. But we
|
|
|
+ * want to know this __now__, so we just perform a dummy copy.
|
|
|
+ */
|
|
|
+ char dummy = 0;
|
|
|
+ err = clEnqueueWriteBuffer(queues[worker->devid], memory, CL_TRUE,
|
|
|
+ 0, sizeof(dummy), &dummy,
|
|
|
+ 0, NULL, NULL);
|
|
|
+ if (err == CL_MEM_OBJECT_ALLOCATION_FAILURE)
|
|
|
+ return err;
|
|
|
+ if (err != CL_SUCCESS)
|
|
|
+ STARPU_OPENCL_REPORT_ERROR(err);
|
|
|
+
|
|
|
*mem = memory;
|
|
|
return CL_SUCCESS;
|
|
|
}
|