[Beignet] [PATCH] Move the memory allocate size check to the callee.
Yang Rong
rong.r.yang at intel.com
Mon Jan 6 19:30:54 PST 2014
Because image's alignment, the alloc size may exceed the CL_DEVICE_MAX_MEM_ALLOC_SIZE if the
image's size is calculate from it. So move the size check from cl_mem_allocate to the callee, and
slightly enlarge the limit size when check in allocate image.
Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
src/cl_gt_device.h | 2 +-
src/cl_mem.c | 43 +++++++++++++++++++++++++++++--------------
2 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/src/cl_gt_device.h b/src/cl_gt_device.h
index 30692f8..110988a 100644
--- a/src/cl_gt_device.h
+++ b/src/cl_gt_device.h
@@ -51,7 +51,7 @@
.min_data_type_align_size = sizeof(cl_long) * 16,
.single_fp_config = 0, /* XXX */
.global_mem_cache_type = CL_READ_WRITE_CACHE,
-.global_mem_size = 256 * 1024 * 1024,
+.global_mem_size = 128 * 1024 * 1024,
.max_constant_buffer_size = 512 << 10,
.max_constant_args = 8,
.error_correction_support = CL_FALSE,
diff --git a/src/cl_mem.c b/src/cl_mem.c
index 5c4b197..72cf92b 100644
--- a/src/cl_mem.c
+++ b/src/cl_mem.c
@@ -200,23 +200,9 @@ cl_mem_allocate(enum cl_mem_type type,
cl_mem mem = NULL;
cl_int err = CL_SUCCESS;
size_t alignment = 64;
- cl_ulong max_mem_size;
assert(ctx);
- /* Due to alignment, the image size may exceed alloc max size, check global mem instead */
- if ((err = cl_get_device_info(ctx->device,
- CL_DEVICE_GLOBAL_MEM_SIZE,
- sizeof(max_mem_size),
- &max_mem_size,
- NULL)) != CL_SUCCESS) {
- goto error;
- }
- if (UNLIKELY(sz > max_mem_size)) {
- err = CL_INVALID_BUFFER_SIZE;
- goto error;
- }
-
/* Allocate and inialize the structure itself */
if (type == CL_MEM_IMAGE_TYPE) {
struct _cl_mem_image *image = NULL;
@@ -289,6 +275,7 @@ cl_mem_new_buffer(cl_context ctx,
cl_int err = CL_SUCCESS;
cl_mem mem = NULL;
+ cl_ulong max_mem_size;
if (UNLIKELY(sz == 0)) {
err = CL_INVALID_BUFFER_SIZE;
@@ -334,6 +321,19 @@ cl_mem_new_buffer(cl_context ctx,
goto error;
}
+ if ((err = cl_get_device_info(ctx->device,
+ CL_DEVICE_MAX_MEM_ALLOC_SIZE,
+ sizeof(max_mem_size),
+ &max_mem_size,
+ NULL)) != CL_SUCCESS) {
+ goto error;
+ }
+
+ if (UNLIKELY(sz > max_mem_size)) {
+ err = CL_INVALID_BUFFER_SIZE;
+ goto error;
+ }
+
/* Create the buffer in video memory */
mem = cl_mem_allocate(CL_MEM_BUFFER_TYPE, ctx, flags, sz, CL_FALSE, &err);
if (mem == NULL || err != CL_SUCCESS)
@@ -520,6 +520,7 @@ _cl_mem_new_image(cl_context ctx,
uint32_t bpp = 0, intel_fmt = INTEL_UNSUPPORTED_FORMAT;
size_t sz = 0, aligned_pitch = 0, aligned_slice_pitch = 0, aligned_h;
cl_image_tiling_t tiling = CL_NO_TILE;
+ cl_ulong max_mem_size;
/* Check flags consistency */
if (UNLIKELY((flags & (CL_MEM_COPY_HOST_PTR | CL_MEM_USE_HOST_PTR)) && data == NULL)) {
@@ -596,6 +597,20 @@ _cl_mem_new_image(cl_context ctx,
}
sz = aligned_pitch * aligned_h * depth;
+
+ if ((err = cl_get_device_info(ctx->device,
+ CL_DEVICE_MAX_MEM_ALLOC_SIZE,
+ sizeof(max_mem_size),
+ &max_mem_size,
+ NULL)) != CL_SUCCESS) {
+ goto error;
+ }
+ max_mem_size *= 1.1; //enlarge alloc size limit because of alignment
+ if (UNLIKELY(sz > max_mem_size)) {
+ err = CL_INVALID_BUFFER_SIZE;
+ goto error;
+ }
+
mem = cl_mem_allocate(CL_MEM_IMAGE_TYPE, ctx, flags, sz, tiling != CL_NO_TILE, &err);
if (mem == NULL || err != CL_SUCCESS)
goto error;
--
1.8.3.2
More information about the Beignet
mailing list